Java BigDecimal setScale和舍入为half_even

时间:2014-11-26 05:21:33

标签: java

我使用带有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。对此有何解释?

1 个答案:

答案 0 :(得分:4)

这是由浮点不精确引起的(在double输入值中)。

System.out.println(new BigDecimal(1.115));

1.1149999999999999911182158029987476766109466552734375

改为使用String构造函数。

BigDecimal.valueOf("1.115")

一旦数字为BigDecimal,就不会丢失精度,并且舍入工作正常。 但是你必须确保数字完整地进入BigDecimal(并且在此之前还没有通过强制它通过浮点类型而丢失精度)。