Java 6和Java 8中的不同舍入结果

Different Rounding Results in Java 6 and Java 8

本问题已经有最佳答案,请猛点这里访问。

我正在重写一个旧Java 6程序,用于编写Java 8中的一些科学计算,并且在这种情况下,我在舍入操作中得到不同的结果。

Java 6是将EDCOX1 0的输入(如EDCOX1)1的一个输入舍入,但是Java 8使其成为0。我不能理解这里的问题。

例如:

1
2
3
private void foo() {
    System.out.println(Math.round(0.499999999999999999994));
}

上面的代码对于不同的Java版本有不同的行为。

如果有人能对这个问题有所了解,那就太好了。


我想你在EDOCX1 0中发现了一个已知的bug,它后来被固定在Java 7中。这就解释了Java 6Java 8中奇怪的代码行为。

错误信息:

http://bugs.java.com/bugdatabase/view_bug.do?错误ID=6430675

@olivercharlesworth提供的更多信息和漂亮的解释可以在本文中找到:

为什么Math.Round(0.49999999999994)返回1

摘自他的帖子:

In Java 6 (and presumably earlier), round(x) is implemented as
floor(x+0.5). This is a specification bug, for precisely this one
pathological case. Java 7 no longer mandates this broken
implementation.


您的示例的输出是0的原因是不同的。0.999999999999999999994是一个double。将double强制转换为,它将删除double值的小数点。

1
2
3
4
5
6
7
8
9
public class Example {
    public static void main(String[] args) {
        double d1 = 0.9;
        Double D1 = Double.valueOf(d1);
        int d1AsInt = (int)d1;
        System.out.println("d1 as int:\t" + d1AsInt);
        System.out.println("d1 as int:\t" + D1.intValue());
    }
}

如果您依赖精确的值,那么应该使用BigDecimalBigInteger