为什么 RoundingMode.HALF_EVEN 在 BigDecimal 除法中将 0.45 舍入到 0.5?

Why does RoundingMode.HALF_EVEN in BigDecimal division round 0.45 to 0.5?

舍入模式 HALF_EVEN 应该将以 5 结尾的(十进制)数字舍入到最接近 even 更不精确的数字(例如,4.5 舍入为 4 , 而 5.5 四舍五入为 6).

现在看来,Java 对 BigDecimal 的划分不符合该规则;以下代码将其舍入到 0.45 到 0.5:

import java.math.*;

class Round {
    public static void main(String[] args) {
        BigDecimal five = BigDecimal.valueOf(5);
        BigDecimal eleven = BigDecimal.valueOf(11);
        BigDecimal x = five.divide(eleven, 1, RoundingMode.HALF_EVEN);
        System.out.println(x);
    }
}

输出0.5 请注意 5/11 = 0.4545454545... 所以当查看小数点后的前两位数字 0.45 时,我们显然希望看到它四舍五入到最近的偶数邻居,即 0.40,而不是 0.50。

谁能解释一下?

(以防万一,我是 运行 java -version = openjdk version "11.0.15" 2022-04-19)

注:

  1. 这与在 将值放入 BigDecimal 之前舍入 无关;的确 使用字符串构造函数时结果不变
     BigDecimal five = new BigDecimal("5");
     BigDecimal eleven = new BigDecimal("11");
     BigDecimal x = five.divide(eleven, 1, RoundingMode.HALF_EVEN);
  1. 它也不取决于我们四舍五入的比例(只要比例是奇数),您可以按比例放大数字(例如,舍入 500/11)。

HALF_EVEN:

round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.

所以需要先判断两个邻居是否等距

so when looking at the first two digits after the decimal point...

这不足以确定值是否与两个邻居等距,在本例中为 0.4 和 0.5。在这种情况下,我们需要再看一位数字。

在 5/11 的情况下,5/11 更接近 0.5(距离 = 0.045454545 ...)而不是 0.4(距离 = 0.0545454 ...),因此“向偶数邻居舍入”不是已应用,并且“向 'nearest neighbor' 舍入”