Double to int cast 如何在 Java 中工作

2022-09-01 14:29:45

我是Java的新手,想知道双倍到int cast是如何工作的?我知道通过采用低32位来长整顿很简单,但是双倍(64位)到int(32位)呢?二进制中双精度浮点格式的64位是双精度浮点格式(尾数),那么它如何在内部转换为int?


答案 1

这一切都记录在JLS的第5.1.3节中

在第一步中,浮点数转换为长整型(如果 T 为长整型),或转换为整型(如果 T 为字节、短整型、字符号或整型),如下所示:

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

  • 否则,如果浮点数不是无穷大,则浮点值将舍入为整数值 V,并使用 IEEE 754 向零舍入模式 (§4.2.3) 舍入为零。那么有两种情况:

    • 如果 T 是 long,并且这个整数值可以表示为 long,则第一步的结果是 long 值 V。

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

  • 否则,必须满足以下两种情况之一:

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

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

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

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


答案 2

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

    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...