我最近刚遇到一个BigDecimal我以前没有意识到的行为.对于精度很重要的区域,我总是将它们用作双倍的替代方法.例如在财务计算中.
但是我最近遇到了这个事实
new BigDecimal("1.0").equals(new BigDecimal("1")) == false
Run Code Online (Sandbox Code Playgroud)
我不得不承认我对此感到惊讶.我认为这是因为第一个的比例为1,而第二个的比例为0,但它似乎仍然是反直觉的.我认为之前我从未遇到过的原因是因为我们总是使用固定比例BigDecimals进行财务计算.
检查BigDecimal 文档我可以看到,这compareTo() == 0应该用于检查忽略比例的相等性,同时equals()比较值和比例.
当使用BigDecimal不同尺度的s 时,我应该注意其他类似的问题吗?
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)