我认为这很有趣:
System.out.println( (long)(Math.pow(2,63) - 1) == Long.MAX_VALUE); // true
System.out.println( (long)(Math.pow(2,63) - 5) == Long.MAX_VALUE); // true
System.out.println( (long)(Math.pow(2,63) - 512) == Long.MAX_VALUE); // true
System.out.println( (long)(Math.pow(2,63) - 513) == Long.MAX_VALUE); // false
最后三行应该打印
false
,但实际上只有最后一个,在其中我减去了513
给出了正确的答案。为什么512/513是不准确的分界点?我能想到的唯一联系就是512是千字节的一半。
我知道这个问题的原因是
double
的不准确性,这源于Math.pow(int, int)
返回一个double
。我尝试过使用
java.math.BigInteger
,这是我的结果:BigInteger b = new BigInteger("2");
System.out.println( (b.pow(63).longValue() - 1) == Long.MAX_VALUE ); // true
System.out.println( (b.pow(63).longValue() - 5) == Long.MAX_VALUE ); // false
System.out.println( (b.pow(63).longValue() - 512) == Long.MAX_VALUE ); // false
System.out.println( (b.pow(63).longValue() - 513) == Long.MAX_VALUE ); // false
double d = Long.MAX_VALUE; System.out.println(d-512 == d); System.out.println(d-513 == d);
- assylias