如何在 Java 中使用 double to int cast

Posted

技术标签:

【中文标题】如何在 Java 中使用 double to int cast【英文标题】:How does double to int cast work in Java 【发布时间】:2012-09-20 14:34:54 【问题描述】:

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

【问题讨论】:

截断小数,只返回整数作为整数。 很惊讶以前没有人问过这个问题。 【参考方案1】:

这一切都记录在 JLS 的 section 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 处理。

【讨论】:

我不太明白。你能举个例子吗?就像从一个很长的浮点数到 int 在这种情况下,请阅读引文的最后一句话。您每次都会获得 MAX_VALUE。 对不起,我想我不清楚第一步。它是否通过二进制转换它?以double x = 54.3578为例,第一步会发生什么? @user1389813:值 is 以二进制开头。在编译时,编译器会将文字 54.3578 转换为最接近的可表示 IEEE-754 64 位双精度值。 @user1389813:正如我在回答中所写的,大部分时间 CPU 都会这样做。如果 CPU 不直接支持浮点,它将在 JVM 内部实现,代码可以理解 IEEE-754 ......但在这一点上,我们离真正的 Java 特定还有很长的路要走,目前还不清楚为什么你真的很想知道。 效果是重要的部分,这在我的回答中指定了·【参考方案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...

【讨论】:

我认为问题不在于怎么做,而是演员背后的机制【参考方案3】:

您可能需要阅读 Java 规范:

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

相关章节是 5.1.3 - “Narrowing Primitive Conversion”。

【讨论】:

以上是关于如何在 Java 中使用 double to int cast的主要内容,如果未能解决你的问题,请参考以下文章

double to char* 没有任何外部方法

PHP 科学计数 转 Double

如何使java中double类型不以科学计数法表示

如何更改snakeyaml中的隐式类型(int to double)

How to: Use XPO Upcasting in XAF 如何:在 XAF 中使用 XPO 强制转换

将 Int 指针分配给 double 变量