Double to int cast 如何在 Java 中工作
我是Java的新手,想知道双倍到int cast是如何工作的?我知道通过采用低32位来长整顿很简单,但是双倍(64位)到int(32位)呢?二进制中双精度浮点格式的64位是双精度浮点格式(尾数),那么它如何在内部转换为int?
我是Java的新手,想知道双倍到int cast是如何工作的?我知道通过采用低32位来长整顿很简单,但是双倍(64位)到int(32位)呢?二进制中双精度浮点格式的64位是双精度浮点格式(尾数),那么它如何在内部转换为int?
这一切都记录在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类型的最大可表示值。
(这里的第二步是无关紧要的,当是 .T
int
在大多数情况下,我希望这可以通过硬件支持来实现 - 将浮点数转换为整数通常由CPU处理。
如果您使用(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...