有人可以给我解释一下吗
public static void main(String[] args) {
long a = 0;
long b = 0;
Random r = ThreadLocalRandom.current();
for (int i = 0; i < 1000; i++) {
double d = r.nextDouble()*(r.nextBoolean() ? 1.0 : -1.0);
a += d*100;
b += (long)(100*d);
//System.out.println(a + " " + b + " " + d);
}
System.out.println(a);
System.out.println(b);
}
为什么 a != b 在这个循环的末尾。这是矩阵中的故障吗?如果我删除“d”的随机签名,那么 a == b。为什么?
最佳答案
这里发生的是四舍五入。
你的任务:
a += d*100
b += (long)(100*d);
将被执行为:
a = (long)(a + d * 100);
b = b + (long)(100 * d);
在一个循环之后,当 a 和 b 为正而 d 为负时,a 和 b 可以不同,反之亦然。将 d*100 添加到 a 时,您添加的是精确值(例如 -1.1),而对于 b,它将首先四舍五入为 -1。 让我们举个例子。在循环开始时,我们将获得这些值:
a = b = 1024
d = -0.178
单次运行的最终结果将是:
a = (long)(1024-17.8) = (long)(1006.2) = 1006
b = 1024-(long)17.8 = 1024-17 = 1007
关于Java double to long 转换报错之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58779160/