我刚刚遇到BigDecimal
内部的一个我以前没有意识到的行为。对于精度很重要的区域,我总是将它们用作双倍的替代方法。例如,在财务计算中。
但是我最近遇到了这个事实
new BigDecimal("1.0").equals(new BigDecimal("1")) == false
我不得不承认我对此感到惊讶。我认为这是因为第一个的比例为1,而第二个的比例为0,但它似乎仍然是反直觉的。我认为我之前从未遇到过的原因是因为我们总是使用固定比例BigDecimals
进行财务计算。
检查BigDecimal
documentation我可以看到compareTo() == 0
应该用来检查忽略比例的等式,同时equals()
比较值和比例。
使用不同比例的BigDecimal
时,我是否应该注意其他类似问题?
答案 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()
也不相同。
问题在于,虽然您知道==
无法比较内容,但您可能会被告知.equals
是String
的解决方案,但它可能无法做到你打算用于BigDecimal。
对于compareTo
,它必须处理大于或小于的值,因为这些值既不大于也不小于它们只能相等(但不等于)。
答案 2 :(得分:1)