3 回答
TA贡献1802条经验 获得超10个赞
JDK 6中的源代码:
public static long round(double a) {
return (long)Math.floor(a + 0.5d);
}
JDK 7中的源代码:
public static long round(double a) {
if (a != 0x1.fffffffffffffp-2) {
// a is not the greatest double value less than 0.5
return (long)Math.floor(a + 0.5d);
} else {
return 0;
}
}
当值为0.49999999999999994d时,在JDK 6中,它将调用floor,因此返回1,但在JDK 7中,if条件是检查该数字是否为小于0.5的最大double值。由于在这种情况下,该数字不是小于0.5的最大double值,因此该else块返回0。
您可以尝试0.49999999999999999d,它将返回1,但不会返回0,因为这是小于0.5的最大double值。
TA贡献1796条经验 获得超4个赞
我在32位的JDK 1.6上具有相同的功能,但是在Java 7 64位的上,对于0.49999999999999994则具有0,其四舍五入为0,并且不打印最后一行。这似乎是VM的问题,但是,使用浮点运算,您应该期望在各种环境(CPU,32位或64位模式)下结果会有所不同。
并且,当使用round或求逆矩阵等时,这些位会产生很大的不同。
x64输出:
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 0
添加回答
举报