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

Different Rounding Results in Java 6 and Java 8

我正在重写一个旧的 Java 6 程序,该程序是为在 Java 8 中执行一些科学计算而编写的,但在这种情况下我得到了不同的舍入操作结果。

Java 6 将 0.499999999999999999994 之类的输入四舍五入为 1,但 Java 8 将其设为 0。我无法理解这里的问题。

例如:

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

以上代码对于不同的 Java 版本表现不同。

如果有人能阐明这个问题就太好了。

我认为您偶然发现了 Java 6 中的一个已知错误,该错误后来在 Java 7 中得到修复。这解释了 Java 6Java 8 中奇怪的代码行为。

错误信息:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675

更多信息和@OliverCharlesworth 的精彩解释可以在这个 post:

中找到

Why does Math.round(0.49999999999999994) return 1

摘自他的 post:

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 转换为 an 它会删除 double 值的小数位。

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