BigDecimal#compareTo具有不同的比例

时间:2018-06-13 23:30:58

标签: java bigdecimal

为什么以下内容会返回1

new BigDecimal(0.82).setScale(5, BigDecimal.ROUND_HALF_DOWN)
    .compareTo(new BigDecimal(0.82))

我希望这会返回0,因为BigDecimal.compareTo 会根据documentation忽略比例

  

将此BigDecimal与指定的BigDecimal进行比较。两个BigDecimal对象相等的值但不同比例(如2.02.00)被考虑等于这个方法。 [...]

2 个答案:

答案 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.02.00)被认为是相同的。 [...]