I’m experimenting with the code I found here 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());
}
}
The answer to the question “what does it print” seemed obvious once I realized that there is an implicit cast with the compound assignment operator +=.
But it printed something like: 420000006 or 420000007,
instead of (the expected) 420000000 (or “42”, after removing trailing zeros).
So that was showing that casting from double to int is not always just dropping the decimal part of the double as stated here: How to cast a double to an int in Java?
So I made some trials and here is an example of what I found:
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 !!!
…So now I’m looking for an explanation for that behavior ???
Maybe you would be amazed with the fact that
You dont have to event cast it into the int.
There is problem with double representation in Java (and other languages too). The system doesn’t use ‘decimal’ part as we human does.
It’s in length explained here:
http://en.wikipedia.org/wiki/Floating_point
But, in short, the double value is store as few parts that are put togather to get final result (image something like -1.23*10^-15). And you have only limited space for each of these given number. So in the end you can’t exactly represent every number beween Double.MAX_VALUE and Double.MIN_VALUE.