我最近发现了BigDecimal
中一种我之前不知道的行为。我一直将它们用作替代double以便在需要精度的区域使用,例如在财务计算中。
然而,最近我发现了这个事实。
new BigDecimal("1.0").equals(new BigDecimal("1")) == false
我必须承认,这让我感到惊讶。我认为这是因为第一个数字的比例为1,而第二个数字的比例为0,但仍然似乎很不直观。我认为我以前从未遇到过这种情况,是因为我们一直在金融计算中使用固定比例的BigDecimals
。
查看BigDecimal
文档,我发现它说应使用compareTo() == 0
来检查忽略比例的相等性,而equals()
则比较值和比例。
在使用具有不同比例的BigDecimal
时,是否还有其他类似的陷阱需要注意?
new BigDecimal(0.1)
和BigDecimal.valueOf(0.1)
返回不同的结果。第一个是double值的表示形式,会像这样:0.1000000000000000055511151231257827021181583404541015625
,而第二个是0.1
。 - Powerlordnew BigDecimal(0.1f)
不等于new BigDecimal(0.1)
;) - Peter Lawrey