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

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>