Java中的double到int的转换是如何工作的?

28
我刚接触Java,想知道如何将double转换为int?我知道将long转换为int很简单,只需取低32位即可,但是将64位的double转换为32位的int该怎么做呢?将Double-precision浮点格式(Mantissa)中的这64位以二进制形式表示,那它在内部是如何转换成int的呢?

它截去小数部分,将整数作为int返回。 - Corey Ogburn
3
惊讶于这个问题以前从未被提出过。 - UmNyobe
3个回答

20

这些内容都在JLS的section 5.1.3中有详细记录。

在第一步中,将浮点数转换为long(如果T是long)或int(如果T是byte、short、char或int),方法如下: 如果浮点数是NaN(§4.2.3),则转换的第一步结果为int或long 0。 否则,如果浮点数不是无穷大,则使用IEEE 754向零舍入模式(§4.2.3)将浮点值四舍五入为整数值V。然后有两种情况: 如果T是long,并且该整数值可以表示为long,则第一步的结果是long值V。 否则,如果该整数值可以表示为int,则第一步的结果是int值V。 否则,以下两种情况之一必须为真: 该值太小(具有较大幅度的负值或负无穷大),第一步的结果是类型int或long的最小可表示值。 该值太大(具有较大幅度的正值或正无穷大),第一步的结果是类型int或long的最大可表示值。
这里的第二步是无关紧要的,当 Tint 时。
在大多数情况下,我希望这是通过硬件支持来实现的 - 将浮点数转换为整数通常是由 CPU 处理的。

1
我真的不是很理解。你能举个例子吗?就像从一个非常长的浮点数转换为整数。 - peter
1
在这种情况下,请阅读引语的最后一句话。您每次都会得到MAX_VALUE。 - Peter Lawrey
抱歉,我觉得我对第一步不是很清楚。它是否通过二进制进行转换?以双精度变量x = 54.3578为例,第一步会发生什么? - peter
@user1389813:起初,该值二进制的。在编译时,编译器将把文字54.3578转换为最接近的IEEE-754 64位双精度表示值。 - Jon Skeet
@JonSkeet 但是它是如何从IEEE 754双精度二进制浮点格式中提取出那个54的,其中包含了符号、指数和小数部分呢? - peter
2
正如我在答案中所写的,大多数情况下CPU会处理浮点运算。如果CPU不直接支持浮点运算,它将在JVM内部实现,使用理解IEEE-754的代码...但此时我们已经远离任何真正特定于Java的内容,而且不清楚为什么你真的想知道。影响是重要的部分,这在我的答案中有说明。 - Jon Skeet

14
Java在使用(int)强制类型转换时,会截断其值,可能会注意到:
    double d = 2.4d;
    int i = (int) d;
    System.out.println(i);
    d = 2.6;
    i = (int) d;
    System.out.println(i);

输出:

2
2

除非您使用Math.round、Math.ceil或Math.floor...


5
我认为问题不在于如何做,而在于铸造背后的机理。 - UmNyobe

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接