如何在Java中使用double转换为int

pet*_*ter 25 java primitive casting mantissa

我是Java的新手,想知道如何对int转换工作?我理解通过采用低32位来实现long很简单,但是对于int(32位)来说,加倍(64位)呢?来自二进制二进制的64位是双精度浮点格式(尾数),那么它如何在内部转换为int?

Jon*_*eet 16

这些都记录在JLS的5.1.3节中.

在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:

如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0.

  • 否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值V,使用IEEE 754舍入为零的模式(第4.2.3节)向零舍入.然后有两种情况:

    • 如果T很长,并且该整数值可以表示为long,则第一步的结果是长值V.

    • 否则,如果此整数值可以表示为int,则第一步的结果是int值V.

  • 否则,以下两种情况之一必须为真:

    • 该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值.

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

(这里的第二个步骤是无关紧要的,当Tint).

在大多数情况下,我希望使用硬件支持来实现 - 将浮点数转换为整数通常由CPU处理.

  • @ user1389813:正如我在回答中所写,大部分时间CPU会这样做.如果CPU不直接支持浮点,它将在JVM内部实现,其代码可以理解IEEE-754 ......但是在这一点上,我们距离任何真正的Java特定的东西还有很长的路要走,目前还不清楚为什么你真的想知道.*效果*是重要的部分,并且在我的答案中指定了· (2认同)

aru*_*aku 13

如果您使用(int)强制转换,Java会截断其值,您可能会注意到:

    double d = 2.4d;
    int i = (int) d;
    System.out.println(i);
    d = 2.6;
    i = (int) d;
    System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

输出:

2
2
Run Code Online (Sandbox Code Playgroud)

除非你使用Math.round,Math.ceil,Math.floor ......

  • 我认为问题不在于怎么做,而是演员背后的机制 (3认同)