为什么以下内容返回1
new BigDecimal(0.82).setScale(5, BigDecimal.ROUND_HALF_DOWN)
.compareTo(new BigDecimal(0.82))
我预计这将返回0
,因为BigDecimal.compareTo
根据其文档忽略了缩放
将此
BigDecimal
与指定的BigDecimal
进行比较。两个BigDecimal
对象(如2.0
和2.00
)在值上是相等的,但是有一个不同的标度(如2.0
和2.00
),因此被认为是相等的。..。
发布于 2018-06-13 15:44:09
new BigDecimal(0.82)
实际上不是0.82,因为您要向构造函数传递一个double
值--最接近于0.82的double
,而不是确切的0.82 --因此new BigDecimal(0.82)
是一个BigDecimal
,等于最接近0.82的double
。
相反,使用new BigDecimal("0.82")
。
发布于 2018-06-13 15:55:21
问题是您使用了构造函数BigDecimal#BigDecimal(double)
。它返回一个BigDecimal
,它表示双二进制浮点值(参见其文档 )。但是,0.82
并不表示值0.82
,而是
0.81999999999999995115018691649311222136020660400390625
由于这个原因,.setScale(5, BigDecimal.ROUND_HALF_DOWN)
实际上改变了值,而不仅仅是标度。应用该方法后的结果值为
0.82000
compareTo
方法忽略标度,但不忽略不同值的。如前所述,两个BigDecimal
实际上表示不同的值。因此,compareTo
不返回0
0.82000 != 0.81999999999999995115018691649311222136020660400390625
请参见方法的文档:
根据该方法,两个
BigDecimal
对象(如2.0
和2.00
)在值中相等,但具有不同的标度(如2.0
和2.00
)。..。
https://stackoverflow.com/questions/50847683
复制相似问题