Java – converting from double to int does not always just discard the decimal part
I'm experimenting with the code I found here the Java specialties' 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 to print" seems obvious once I realize that there is an implicit actor with compound assignment operator =
But it prints out, such as: 420000006 or 420000007, instead of (expected) 420000000 (or "42", delete trailing zeros)
Therefore, this shows that the conversion from double to int does not always just give up the double decimal part, as described here: how to cast a double to an int in Java?
So I did some experiments. Here is an example 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 this behavior?
Solution
You may be surprised by the fact
System.out.println(131072.99999999999); // -> 131073 !!!
You don't have to convert the event to int
There is also the problem of double representation in Java (and other languages) The system does not use the 'decimal' part as humans do
Here is a long explanation: http://en.wikipedia.org/wiki/Floating_point
But in short, double value is to store a few things to get the final result (like -1.23 * 10 ^ - 15) Moreover, for these given numbers, your space is limited So in the end, you can't completely represent double MAX_ Value and double MIN_ Each number in value