还有其他陷阱类似于BigDecimal(“1.0”)。equals(new BigDecimal(“1”)返回false?

时间:2015-04-23 13:49:08

标签: java bigdecimal

我刚刚遇到BigDecimal内部的一个我以前没有意识到的行为。对于精度很重要的区域,我总是将它们用作双倍的替代方法。例如,在财务计算中。

但是我最近遇到了这个事实

new BigDecimal("1.0").equals(new BigDecimal("1")) == false

我不得不承认我对此感到惊讶。我认为这是因为第一个的比例为1,而第二个的比例为0,但它似乎仍然是反直觉的。我认为我之前从未遇到过的原因是因为我们总是使用固定比例BigDecimals进行财务计算。

检查BigDecimal documentation我可以看到compareTo() == 0应该用来检查忽略比例的等式,同时equals()比较值和比例。

使用不同比例的BigDecimal时,我是否应该注意其他类似问题?

3 个答案:

答案 0 :(得分:3)

BigDecimal有一个值和一个比例。两者都需要相等才能使BigDecimals相等。来自java文档。 。

  

与compareTo不同,此方法认为两个BigDecimal对象相等   只有它们的价值和规模相等(因此2.0不等于   2.00用这种方法比较时。)

https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#equals(java.lang.Object)

答案 1 :(得分:2)

BigDecimal equals检查两个BigDecimal对象的内容是否相同。例如他们的toString()会是一样的。正如" 1.0"和" 1"由于new BigDecimal("1.0").equals(new BigDecimal("1"))unscaledValue()不同,getScale()也不相同。

问题在于,虽然您知道==无法比较内容,但您可能会被告知.equalsString的解决方案,但它可能无法做到你打算用于BigDecimal。

对于compareTo,它必须处理大于或小于的值,因为这些值既不大于也不小于它们只能相等(但不等于)。

答案 2 :(得分:1)

根据equals()的JavaDoc:

  

compareTo不同,此方法只考虑两个BigDecimal个对象的值和比例相等(因此通过此方法比较时2.0不等于2.00)。

因此equals()会检查对象是否完全相同compareTo()"仅限"比较它们的数值。