为什么以下内容会返回1
?
new BigDecimal(0.82).setScale(5, BigDecimal.ROUND_HALF_DOWN)
.compareTo(new BigDecimal(0.82))
我希望这会返回0
,因为BigDecimal.compareTo
会根据documentation忽略比例:
将此
BigDecimal
与指定的BigDecimal
进行比较。两个BigDecimal
对象相等的值但不同比例(如2.0
和2.00
)被考虑等于这个方法。 [...]
答案 0 :(得分:4)
new BigDecimal(0.82)
实际上不是0.82,因为您将double
值 - double
最接近传递给0.82,这不完全是0.82 - 对于构造函数,new BigDecimal(0.82)
是BigDecimal
,等于最接近0.82的double
。
相反,请使用new BigDecimal("0.82")
。
答案 1 :(得分:2)
问题是您使用构造函数BigDecimal#BigDecimal(double)
。它返回一个BigDecimal
,表示double的二进制浮点值(请参阅其documentation)。但是,0.82
不代表值0.82
,而是
0.81999999999999995115018691649311222136020660400390625
因为.setScale(5, BigDecimal.ROUND_HALF_DOWN)
实际上更改了值,而不仅仅是比例。应用该方法后得到的值是
0.82000
compareTo
方法会忽略比例,但不会忽略不同的值。如上所述,您的两个BigDecimal
实际上代表不同的值。因此compareTo
不会返回0
:
0.82000 != 0.81999999999999995115018691649311222136020660400390625
请参阅方法的documentation:
这两种
BigDecimal
对象值相等但具有不同的比例(如2.0
和2.00
)被认为是相同的。 [...]