我在从 double 转换为 long 时遇到问题:
double power = Math.pow(2, 63);
long powerInLong = (double) power;
上面的代码返回:
9223372036854775807
虽然它应该返回:
-9223372036854775808
我很困惑为什么会这样。
提前致谢!
我在从 double 转换为 long 时遇到问题:
double power = Math.pow(2, 63);
long powerInLong = (double) power;
上面的代码返回:
9223372036854775807
虽然它应该返回:
-9223372036854775808
我很困惑为什么会这样。
提前致谢!
您正在进行从doubleto的转换long,这是一种缩小的原始转换。
JLS §5.1.3(强调我的)中明确规定了这种转换:
浮点数到整数类型 T 的窄化转换需要两个步骤:
第一步,浮点数转换为 long(如果 T 为 long)或转换为 int(如果 T 为 byte、short、char 或 int),如下所示:
如果浮点数是 NaN(第 4.2.3 节),则转换第一步的结果是 int 或 long 0。
否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 节)向零舍入。那么有两种情况:
一个。如果 T 是 long,并且这个整数值可以表示为 long,那么第一步的结果就是 long 值 V。
湾。否则,如果这个整数值可以表示为 int,那么第一步的结果就是 int 值 V。
否则,以下两种情况之一必须为真:
一个。该值必须太小(一个大的负值或负无穷大),第一步的结果是int或long类型的最小可表示值。
湾。该值一定是太大了(一个大的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。
因为 2^63 超出了long(但不是 double 的范围)的范围,所以将其转换为 long 将导致最大的long. 这也可以通过转换为 来证明Math.pow(2, 64),long结果相同long。