BigDecimal的stripTrailingZeros方法对于零不起作用。

12

我在我的代码中遇到了奇怪的bug。

它与...有关。

new BigDecimal("1.2300").stripTrailingZeros() 

返回1.23(正确)

但是

new BigDecimal("0.0000").stripTrailingZeros() 

返回 0.0000(奇怪),因此什么也没有发生。

为什么?

如何修复?


我得到了 0 ... 你能发布一个 MVCE 吗? - Tom
1
我也得到了“0” - JDK 8u66。你在运行哪个Java版本?你所说的“返回0.0000”的意思是什么 - 是指toString()将其打印为0.0000吗? - Adam Michalik
4
这是 JDK 8 中修复的一个错误。https://dev59.com/smUq5IYBdhLWcg3wHs2Y#14772904 - Igor Vuković
2个回答

18

看起来这是一个错误(JDK-6480539),已在Java 8中修复(根据OpenJDK提交2ee772cda1d6)。

早期版本的Java的解决方法:

BigDecimal zero = BigDecimal.ZERO;
if (someBigDecimal.compareTo(zero) == 0) {
    someBigDecimal = zero;
} else {
    someBigDecimal = someBigDecimal.stripTrailingZeros();
}

当你无法更新JDK版本时,你需要手动执行修复操作,例如:BigDecimal stripped = blub.intValue() == 0 ? BigDecimal.ZERO : blub.stripTrailingZeros(); - Tom
2
@JordiCastilla OP询问标准库函数的意外行为,Yuri提供了一个带有来源的答案,说明这是标准库中的一个错误。这不是一个答案吗? - Zoltán
1
@JordiCastilla 【它仍然会说明这是一个(已修复的)错误。】(http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer) - Tom
5
不要浪费资源创建自己的零实例,使用BigDecimal.ZERO - Holger
1
你不需要按照“UPD #x”将答案分成不同的部分。对于那些感兴趣的人,可以通过点击“edited…”链接来查看历史记录。因此,请放心地在原始代码中将new BigDecimal("0")替换为BigDecimal.ZERO。你不需要引用我的名字。 - Holger
显示剩余5条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接