Java BigDecimal的setScale和half_even舍入方式

3
我正在使用以下代码,结合java BigDecimal的setScale方法和half_even舍入模式,并得到以下结果。
new BigDecimal(1.115).setScale(2, RoundingMode.HALF_EVEN).toPlainString()

结果:1.11

期望值:1.12

由于5左侧最接近的偶数是2,所以我期望的结果是1.12。但实际结果为1.11。再次说明,

new BigDecimal(1.145).setScale(2, RoundingMode.HALF_EVEN).toPlainString()

结果:1.15

期望值:1.14

因为5左侧的数字是偶数4,所以我期望结果为1.14。有什么解释吗?

1个回答

5
这是由浮点数不精确导致的(在您的double输入值中)。
System.out.println(new BigDecimal(1.115));

1.1149999999999999911182158029987476766109466552734375

请使用String构造函数代替。
BigDecimal.valueOf("1.115")

一旦数字是BigDecimal,就不会丢失精度,并且四舍五入可以正常工作。 但是您必须确保数字完整地进入BigDecimal(并且在此之前没有通过浮点类型强制转换而已经失去了精度)。

我该如何使用setScale方法来设置比例并在此情况下进行四舍五入? - hpd
你可以像代码中那样使用setScale,它可以正常工作(我测试过了)。BigDecimal的四舍五入功能也可以正常工作。你的问题是将浮点数放入BigDecimal之前,它已经存在一些误差,偏离了四舍五入点。 - Thilo
不必将它转换为字符串并使用BigDecimal.valueOf(String value)函数;BigDecimal.valueOf(double value)同样可以按预期工作! - ilyailya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接