半偶数舍入

Half-Even Rounding

根据我的理解,如果您四舍五入的数字与其相邻数字之间的距离相等(例如,如果您在小数点后一位四舍五入,则为 4.5),则将前面的数字四舍五入到最近的偶数。

例如,如果您四舍五入到小数点后的 0 位 1.5、3.5、5.5、7.5 和 9.5 将分别向上取整为 2、4、6、8 和 10。这一切在 netbeans 中都运行良好,但是当我四舍五入到小数点后 1 位时,我 运行 遇到了问题。

package foo;
import java.text.NumberFormat;

public class Foo {
    public static void main(String[] args) {
        NumberFormat formatter = NumberFormat.getNumberInstance();     
        formatter.setMaximumFractionDigits(1);
        System.out.print(formatter.format(4.45));
    }
}

运行:

4.5

BUILD SUCCESSFUL (total time: 0 seconds)

我认为这会四舍五入到 4.4

此外,如果我使用 4.55 输入到格式中,则输出 4.5,而我期望的是 4.6 java 还是我的理解有误?

我不确定这实际上是技术上的错误。

问题在于,当您编写 4.45 并且该值被解释为 double,即四舍五入为 二进制 分数:总和2 的幂的倍数,达到一定的精度。 (四舍五入本身是用 HALF_EVEN 舍入完成的,但是用二进制数字而不是十进制数字。)

该舍入值可能略高于或略低于 4.45,但 NumberFormat 将舍入存储在 double 中的真实二进制值,而不是您写入的十进制值。

您可以通过编写 System.out.println(new BigDecimal(4.45)); 来确定您实际获得的真实二进制值 当我这样做时,我得到 4.45000000000000017763568394002504646778106689453125,这是四舍五入到最接近的 0.1 的实际值 --这肯定会是 4.5.

四舍五入为整数,试试这个

    formatter.setMaximumFractionDigits(0);
    System.out.println(formatter.format(4.5));
    System.out.println(formatter.format(5.5));

输出

4
6