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

我已经开始阅读 Java8 的文档并尝试了不同的示例代码。发现以下奇怪的行为。


样品1


Double di = new Double(Math.pow(2,32-1));

System.out.printf("%f\n",di.doubleValue()); //2147483648.000000

int a= di.intValue();

System.out.println(a); //2147483647

样品2


Double di = new Double(Math.pow(2,32-1)) - 1.0;

System.out.printf("%f\n",di.doubleValue()); //2147483647.000000

int a= di.intValue();

System.out.println(a); //2147483647

为什么在这两种情况下,int 值返回相同的值?


慕妹3146593
浏览 126回答 3
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。

子衿沉夜

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。

料青山看我应如是

int值不能超过Integer.MAX_VALUE,即2147483647。当调用intValue()时,您自愿放弃所有尾部。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java