为什么以下内容返回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 23: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 23:55:21
问题是您使用了构造函数BigDecimal#BigDecimal(double)。它返回一个BigDecimal,它表示双二进制浮点值(参见其文档 )。但是,0.82并不表示值0.82,而是
0.81999999999999995115018691649311222136020660400390625由于这个原因,.setScale(5, BigDecimal.ROUND_HALF_DOWN)实际上改变了值,而不仅仅是标度。应用该方法后的结果值为
0.82000compareTo方法忽略标度,但不忽略不同值的。如前所述,两个BigDecimal实际上表示不同的值。因此,compareTo不返回0
0.82000 != 0.81999999999999995115018691649311222136020660400390625请参见方法的文档:
根据该方法,两个
BigDecimal对象(如2.0和2.00)在值中相等,但具有不同的标度(如2.0和2.00)。..。
https://stackoverflow.com/questions/50847683
复制相似问题