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 6
和 Java 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());
}
}
如果您依赖精确值,则应使用 BigDecimal
和 BigInteger
。
我正在重写一个旧的 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 6
和 Java 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());
}
}
如果您依赖精确值,则应使用 BigDecimal
和 BigInteger
。