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. [...]
为什么会出现下面的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 specifiedBigDecimal
. TwoBigDecimal
objects that are equal in value but have a different scale (like2.0
and2.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 (like2.0
and2.00
) are considered equal by this method. [...]