为什么 System.out.println((long)Math.pow(2,63));System.out.println((long)(Math.pow(2,63)-1)); 在 Java 中的输出相同?

最佳答案

输出是相同的,因为 double 没有足够的位来准确表示 263。
double 的尾数只有 52 位:java - Java 中的类型转换。双到长-LMLPHP

这为您提供最多 17 位十进制数字的精度。另一方面,您计算的值是 9223372036854775808,因此需要 19 位数字才能准确表示。结果,263的实际表示为9223372036854776000:

  • 尾数设置为 1.0(前面的 1 是隐含的)
  • 指数设置为 1086(1024 被隐式减去以产生 63)
  • 1 表示的尾数是一样的,而有效值为 0 的指数是 1024,即两个数的指数相差 63,大于尾数的大小。

    当您的数字表示为 double 时,会发生减 1。由于被减数的大小远大于被减数的大小,因此忽略整个减法运算。

    减去更大的数字后,您会得到相同的结果 - 一直到 512,即 29 ( demo )。之后指数的差异将小于 52,因此您将开始得到不同的结果。

    关于java - Java 中的类型转换。双到长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32666145/

    10-11 19:01