我正在试验我在这里找到的代码 The Java Specialists' Newsletter .
public class MeaningOfLife {
public static String findOutWhatLifeIsAllAbout() {
int meaning = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 20; j++) {
for (int k = 0; k < 300; k++) {
for (int m = 0; m < 7000; m++) {
meaning += Math.random() + 1;
}
}
}
}
return String.valueOf(meaning).replaceAll("0*$", "");
}
public static void main(String[] args) {
System.out.println(findOutWhatLifeIsAllAbout());
}
}
一旦我意识到 compound assignment operator 存在隐式转换,“它打印什么”这个问题的答案就显而易见了+=.
但它打印出类似:420000006 或 420000007, 而不是(预期的)420000000(或“42”,删除尾随零后)。
所以这表明从 double 到 int 的转换并不总是只是删除 double 的小数部分,如下所述:How to cast a double to an int in Java?
所以我做了一些试验,下面是我发现的一个例子:
System.out.println((int) (131070.99999999999)); // -> 131070
System.out.println((int) (131071.99999999999)); // -> 131071
System.out.println((int) (131072.99999999999)); // -> 131073 !!!
System.out.println((int) (131073.99999999999)); // -> 131074 !!!
System.out.println((int) (16382.999999999999)); // -> 16382
System.out.println((int) (16383.999999999999)); // -> 16383
System.out.println((int) (16384.999999999999)); // -> 16385 !!!
System.out.println((int) (16385.999999999999)); // -> 16386 !!!
...所以现在我正在寻找对这种行为的解释???
最佳答案
许多十进制值不可能是 double 值。在使用它们之前,首先必须将它们压缩到最接近的 double 值。
示例:16384.999999999999
没有精确的 double 表示。最接近的两个值是 16384.99999999999636202119290828704833984375
和 16385.0
。向下压缩会产生大约 0.000000000003
的差异,而向上压缩会产生 0.000000000001
的差异 - 向上会产生更接近的值,因此这就是它的解释。
关于java - 从 double 转换为 int 并不总是只删除小数部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403181/