为什么 System.out.println((long)Math.pow(2,63));
和 System.out.println((long)(Math.pow(2,63)-1));
在 Java 中的输出相同?
最佳答案
输出是相同的,因为 double
没有足够的位来准确表示 263。double
的尾数只有 52 位:
这为您提供最多 17 位十进制数字的精度。另一方面,您计算的值是 9223372036854775808,因此需要 19 位数字才能准确表示。结果,263的实际表示为9223372036854776000:
1
表示的尾数是一样的,而有效值为 0 的指数是 1024,即两个数的指数相差 63,大于尾数的大小。当您的数字表示为
double
时,会发生减 1。由于被减数的大小远大于被减数的大小,因此忽略整个减法运算。减去更大的数字后,您会得到相同的结果 - 一直到 512,即 29 ( demo )。之后指数的差异将小于 52,因此您将开始得到不同的结果。
关于java - Java 中的类型转换。双到长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32666145/