3 回答
TA贡献1777条经验 获得超3个赞
请参阅https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3最后以粗体突出显示的重要部分:
浮点数到整型 T 的缩小转换需要两个步骤:
第一步,如果 T 为 long,则浮点数转换为 long;如果 T 为 byte、short、char 或 int,则浮点数转换为 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 类型的最大可表示值。
也就是说,你的双精度值是 2147483648 (你可以尝试使用更大的数字)。int int 的最高可表示值是 2147483647。这就是为什么你最终得到 2147483647。
TA贡献1828条经验 获得超3个赞
int
这是因为Java 中类型的最大值是2147483647
。当您调用时,Double::doubleValue
如果您尝试转换的值超出范围并且此方法的文档中有说明,它将执行缩小转换:
在缩小基元转换后,以 int 形式返回此 Double 的值。
它甚至指向JLS 5.1.3,其中描述了这种缩小转换。
转换浮点值需要两个步骤。第一步、第三点、选项 b 的句子中解释了您看到此值的原因:
该值必须太大(大幅度的正值或正无穷大),并且第一步的结果是 int 或 long 类型的最大可表示值。
浮点数到整型 T 的缩小转换需要两个步骤:
第一步,如果 T 为 long,则浮点数转换为 long;如果 T 为 byte、short、char 或 int,则浮点数转换为 int,如下所示:
如果浮点数为 NaN(第 4.2.3 节),则第一步转换的结果为 int 或 long 0。
否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 节)向零舍入。那么有两种情况:
a如果T是long,并且这个整数值可以表示为long,那么第一步的结果就是long值V。
b否则,如果这个整数值可以表示为int,那么第一步的结果就是int值V。
否则,必须满足以下两种情况之一:
a值必须太小(大幅度的负值或负无穷大),并且第一步的结果是 int 或 long 类型的最小可表示值。
b 该值必须太大(大幅度的正值或正无穷大),并且第一步的结果是 int或 long 类型的最大可表示值。
在第二步中:
如果T是int或者long,转换的结果就是第一步的结果。
如果 T 是字节、字符或短整型,则转换结果是第一步结果缩小转换为类型 T(第 5.1.3 节)的结果。
因此,在这种情况下,结果将是 type 的最大可表示值int
。
添加回答
举报