28

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

4

3 回答 3

20

这一切都记录在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类型的最大可表示值。

(这里的第二步无关紧要,什么时候Tint。)

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

于 2012-09-20T14:38:21.573 回答
14

如果您使用 (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...

于 2012-09-20T14:40:59.123 回答
2

您可能需要阅读 Java 规范:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

相关部分是 5.1.3 - “Narrowing Primitive Conversion”。

于 2012-09-20T14:39:03.273 回答