java – 为什么Math.round(0.49999999999999994)返回1?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么Math.round(0.49999999999999994)返回1?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2019字,纯文字阅读大概需要3分钟。
内容图文
![java – 为什么Math.round(0.49999999999999994)返回1?](/upload/InfoBanner/zyjiaocheng/716/ad1268f558de4a6dad1c5ba6f0e5141f.jpg)
在下面的程序中,您可以看到每个略小于.5的值都向下舍入,除了0.5.
for (int i = 10; i >= 0; i--) {
long l = Double.doubleToLongBits(i + 0.5);
double x;
do {
x = Double.longBitsToDouble(l);
System.out.println(x + " rounded is " + Math.round(x));
l--;
} while (Math.round(x) > i);
}
版画
10.5 rounded is 11
10.499999999999998 rounded is 10
9.5 rounded is 10
9.499999999999998 rounded is 9
8.5 rounded is 9
8.499999999999998 rounded is 8
7.5 rounded is 8
7.499999999999999 rounded is 7
6.5 rounded is 7
6.499999999999999 rounded is 6
5.5 rounded is 6
5.499999999999999 rounded is 5
4.5 rounded is 5
4.499999999999999 rounded is 4
3.5 rounded is 4
3.4999999999999996 rounded is 3
2.5 rounded is 3
2.4999999999999996 rounded is 2
1.5 rounded is 2
1.4999999999999998 rounded is 1
0.5 rounded is 1
0.49999999999999994 rounded is 1
0.4999999999999999 rounded is 0
我正在使用Java 6更新31.
解决方法:
摘要
在Java 6中(可能更早),round(x)被实现为floor(x 0.5).1这是一个规范错误,正是这一个病态案例.2 Java 7不再强制执行这个破坏的实现.3
问题
0.5 0.49999999999999994正是双精度中的1:
static void print(double d) {
System.out.printf("%016x\n", Double.doubleToLongBits(d));
}
public static void main(String args[]) {
double a = 0.5;
double b = 0.49999999999999994;
print(a); // 3fe0000000000000
print(b); // 3fdfffffffffffff
print(a+b); // 3ff0000000000000
print(1.0); // 3ff0000000000000
}
这是因为0.49999999999999994的指数小于0.5,因此当它们被添加时,它的尾数被移位,并且ULP变大.
解决方案
从Java 7开始,OpenJDK(例如)实现了它:4
public static long round(double a) {
if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
return (long)floor(a + 0.5d);
else
return 0;
}
1. http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#round%28double%29
2. http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675(@SimonNickerson发现此信用)
3. http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#round%28double%29
内容总结
以上是互联网集市为您收集整理的java – 为什么Math.round(0.49999999999999994)返回1?全部内容,希望文章能够帮你解决java – 为什么Math.round(0.49999999999999994)返回1?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。