我是 Java 新手,想知道 double to int cast 是如何工作的?我知道通过取低 32 位来 long 到 int 很简单,但是 double(64 位)到 int(32 位)呢?二进制中 double 的那些 64 位是双精度浮点格式(尾数),那么它如何在内部转换为 int 呢?
3 回答
这一切都记录在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,而这个整数值可以表示为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...
您可能需要阅读 Java 规范:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
相关部分是 5.1.3 - “Narrowing Primitive Conversion”。