Java BigDecimal setScale 和 half_even 舍入

Him*_*shi 3 java

我将以下代码与带有 half_even 舍入模式的 java BigDecimal setScale 方法一起使用,并得到以下结果。

new BigDecimal(1.115).setScale(2, RoundingMode.HALF_EVEN).toPlainString()
Run Code Online (Sandbox Code Playgroud)

结果:1.11

预期:1.12

由于最接近 5 左边的偶数应该是 2,所以我期望的结果是 1.12。但结果是 1.11。然后再次,

new BigDecimal(1.145).setScale(2, RoundingMode.HALF_EVEN).toPlainString()
Run Code Online (Sandbox Code Playgroud)

结果:1.15

预期:1.14

因为 5 左边的偶数是 4,所以我希望结果是 1.14。对此有什么解释吗?

Thi*_*ilo 5

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

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

1.1149999999999999911182158029987476766109466552734375
Run Code Online (Sandbox Code Playgroud)

请改用 String 构造函数。

BigDecimal.valueOf("1.115")
Run Code Online (Sandbox Code Playgroud)

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