为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 double 到 int 转换在 java 中不能按预期工作?

为什么 double 到 int 转换在 java 中不能按预期工作?

慕妹3146593 2023-09-27 14:39:12
我已经开始阅读 Java8 的文档并尝试了不同的示例代码。发现以下奇怪的行为。样品1Double di = new Double(Math.pow(2,32-1));System.out.printf("%f\n",di.doubleValue()); //2147483648.000000int a= di.intValue();System.out.println(a); //2147483647样品2Double di = new Double(Math.pow(2,32-1)) - 1.0;System.out.printf("%f\n",di.doubleValue()); //2147483647.000000int a= di.intValue();System.out.println(a); //2147483647为什么在这两种情况下,int 值返回相同的值?
查看完整描述

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。


查看完整回答
反对 回复 2023-09-27
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

int这是因为Java 中类型的最大值是2147483647。当您调用时,Double::doubleValue如果您尝试转换的值超出范围并且此方法的文档中有说明,它将执行缩小转换:

在缩小基元转换后,以 int 形式返回此 Double 的值。

它甚至指向JLS 5.1.3,其中描述了这种缩小转换。

转换浮点值需要两个步骤。第一步、第三点、选项 b 的句子中解释了您看到此值的原因:

该值必须太大(大幅度的正值或正无穷大),并且第一步的结果是 int 或 long 类型的最大可表示值。

浮点数到整型 T 的缩小转换需要两个步骤:

  1. 第一步,如果 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


查看完整回答
反对 回复 2023-09-27
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

int值不能超过Integer.MAX_VALUE,即2147483647当调用intValue()时,您自愿放弃所有尾部。



查看完整回答
反对 回复 2023-09-27
  • 3 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信