BigDecimal#compareTo 不同尺度

BigDecimal#compareTo with different scales

为什么会出现下面的return1

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

我希望这个 return 0 因为 BigDecimal.compareTo 根据其 documentation:[=21= 忽略比例 ]

Compares this BigDecimal with the specified BigDecimal. Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method. [...]

new BigDecimal(0.82) 实际上不是 0.82,因为您传递的是 double 值——double 最接近 到 0.82,这不完全是 0.82 -- 对于构造函数,所以 new BigDecimal(0.82) 是一个 BigDecimal 等于最接近 0.82 的 double

而是使用 new BigDecimal("0.82")

问题是您使用了构造函数BigDecimal#BigDecimal(double)。它 return 是一个 BigDecimal,表示双精度的 二进制浮点值 (请参阅其 documentation)。但是,0.82 不代表值 0.82,而是

0.81999999999999995115018691649311222136020660400390625

因为 .setScale(5, BigDecimal.ROUND_HALF_DOWN) 实际上 改变了值 ,而不仅仅是比例。应用该方法后的结果值为

0.82000

compareTo 方法忽略比例但不忽略不同的值。如前所述,您的两个 BigDecimal 实际上代表不同的值。因此 compareTo 不会 return 0:

0.82000 != 0.81999999999999995115018691649311222136020660400390625

方法见documentation

Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method. [...]