在Java中输入类型.双倍到长

cno*_*ova 3 java typecasting-operator

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

das*_*ght 9

输出是相同的,因为double没有足够的位来准确表示2 63.

尾数的a double只有52位:在此输入图像描述

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

  • 尾数设置为1.0(前面暗示1)
  • 指数设置为1086(隐式减去1024以产生63)

表示的尾数1是相同的,而有效值为零的指数是1024,即两个数字的指数相差63,这大于尾数的大小.

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

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