半偶数舍入

时间:2015-01-10 02:09:15

标签: java 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或我的理解是否有错误?

2 个答案:

答案 0 :(得分:5)

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

问题在于,当您编写4.45并且该值被解释为double时,它将四舍五入为二进制分数:一系列权力的总和2,要精确一些。 (该舍入本身是使用HALF_EVEN舍入完成的,但使用二进制数字而不是十进制数字。)

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

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

答案 1 :(得分:1)

它舍入为整数,试试这个

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

输出

4
6