我正在试验我在这里找到的代码
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的转换不总是只是放弃双倍的小数部分,如这里所述: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 !!!
那么现在我正在寻找一个解释这个行为?