Java 半均匀四舍五入

Java 半均匀四舍五入,java,rounding,Java,Rounding,据我所知,使用半偶数舍入时,如果要舍入的数字在相邻数字之间是等距的(例如,如果要在小数点后舍入1,则为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 s

据我所知,使用半偶数舍入时,如果要舍入的数字在相邻数字之间是等距的(例如,如果要在小数点后舍入1,则为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.4

此外,如果我使用4.55作为格式的输入,那么4.5就是我期望的4.6的输出
java或我的理解有错误吗?

我不确定这在技术上是否是一个bug

问题是,当您写入
4.45
时,该值被解释为
双精度
,四舍五入为二进制分数:精度为2的幂的倍数之和。(舍入本身是通过半偶数舍入完成的,但是使用二进制数字而不是十进制数字。)

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


您可以通过编写
System.out.println(新的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

[s] 你确定默认情况下NumberFormat是一半偶数吗?[/s]没关系,是的。我刚刚运行了你的代码,它给了我4.4,我得到了4.4。你使用的是什么版本的Java?很有趣。Java7给了我4.4,而Java8给了我4.5,这确实是Java8中的一个bug。
4
6