我使用带有half_even舍入模式的java BigDecimal setScale方法的以下代码,并得到以下结果。
new BigDecimal(1.115).setScale(2, RoundingMode.HALF_EVEN).toPlainString()
结果:1.11
预计:1.12
由于距离左边最近的偶数位数应为2,因此我预期的结果为1.12。但结果是1.11。再次,
new BigDecimal(1.145).setScale(2, RoundingMode.HALF_EVEN).toPlainString()
结果:1.15
预计:1.14
因为5左边的偶数是4,我希望结果是1.14。对此有何解释?
答案 0 :(得分:4)
这是由浮点不精确引起的(在double
输入值中)。
System.out.println(new BigDecimal(1.115));
1.1149999999999999911182158029987476766109466552734375
改为使用String构造函数。
BigDecimal.valueOf("1.115")
一旦数字为BigDecimal,就不会丢失精度,并且舍入工作正常。 但是你必须确保数字完整地进入BigDecimal(并且在此之前还没有通过强制它通过浮点类型而丢失精度)。