java中double转int直接截断小数部分,nan、±infinity转为0,超出int范围时按补码截断导致不可预测结果。

double特殊值强转int时的截断逻辑
Java中double转int是**直接截断小数部分**,不是四舍五入,也不做符号调整。对普通数值如3.9、-2.8,结果分别是3和-2——只保留整数位,丢弃全部小数位。
NaN、无穷大等特殊值的转换结果
Java规范明确规定:当double为NaN、Double.POSITIVE_INFINITY或Double.NEGATIVE_INFINITY时,强制转int的结果固定为0。
(int) Double.NaN → 0(int) Double.POSITIVE_INFINITY → 0(int) Double.NEGATIVE_INFINITY → 0
这不是异常,也不会抛出RuntimeException,而是JVM按规范定义的确定性行为——因为这些值本身无法映射到任何有效int,统一归零是最安全的兜底方式。
超出int范围的double值如何处理
int取值范围是[-2147483648, 2147483647]。当double值超出该区间(如3e9或-3e9),强转结果由二进制补码截断决定:
-
(int) 3_000_000_000.0 → -1294967296(溢出后高位被丢弃) (int) -3_000_000_000.0 → 1294967296
这种结果不可预测且无业务意义,必须在转换前用Double.isFinite(d) && d >= Integer.MIN_VALUE && d 校验。
负零与正零的转换一致性
+0.0和-0.0都是合法double值,但强转int后均为0:
(int) +0.0 → 0(int) -0.0 → 0
因为int没有“负零”概念,所有零值统一表示为0,这是类型语义层面的自然归一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











