必须用Double.isNaN(x)和Double.isInfinite(x)判断,因NaN不等于自身、Infinity的equals()在旧JDK有坑;错误写法如x==Double.NaN恒为false,new Double(x).equals(Double.NaN)有null和缓存风险。

Java 中判断浮点数是否为 NaN 或 Infinity,必须使用 JDK 提供的专用静态方法,不能用 ==、.equals() 或直接比较常量——因为 NaN 不等于自身,Infinity 的包装类比较在某些版本中也不可靠。
判断 NaN:只能用 Double.isNaN() 或 Float.isNaN()
NaN(Not-a-Number)表示未定义或无效的计算结果,例如 0.0 / 0.0、Double.NaN + 1、Math.sqrt(-1) 等。它的核心特性是:NaN != NaN 恒为 true。
-
Double.isNaN(x)是唯一安全、跨版本一致的方式 - 错误写法:
x == Double.NaN→ 永远返回false - 错误写法:
new Double(x).equals(Double.NaN)→ 有 null 风险,且依赖包装类缓存逻辑 - 基本类型
double的 NaN 值强转为int或long会变成0;转为float仍为Float.NaN
判断 Infinity:用 Double.isInfinite() 区分正负无穷
Double.isInfinite(x) 返回 true 当且仅当 x 是 Double.POSITIVE_INFINITY 或 Double.NEGATIVE_INFINITY。它内部等价于:
x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 对
NaN、有限数(含0.0)、普通大数(如1e308)都返回false - 若需区分正负,可结合符号判断:
Double.isInfinite(x) && x > 0表示正无穷 - 整数除零(如
1 / 0)仍抛ArithmeticException,只有浮点数(1.0 / 0.0)才产生Infinity
完整校验有效数值:同时排除 NaN 和 Infinity
实际业务中(如统计、归一化、入库前清洗),往往需要确认一个 double 是“正常可参与计算”的值:
- 正确写法:
!Double.isNaN(x) && !Double.isInfinite(x) - 错误写法:
x == x→ 对 NaN 返回false,但对 Infinity 返回true,无法区分二者 - 注意:该组合判断不包含
±0.0,它们是合法有限值,Double.isInfinite(0.0)和Double.isNaN(0.0)均为false
常见来源与典型陷阱
了解它们怎么来,能帮你提前预防问题:
-
1.0 / 0.0 → POSITIVE_INFINITY;-1.0 / 0.0 → NEGATIVE_INFINITY;0.0 / 0.0 → NaN -
Infinity * 0 → NaN;Infinity + (-Infinity) → NaN;Infinity / Infinity → NaN - JSON 序列化时,Jackson 默认拒绝 NaN/Infinity,需配置
WRITE_NUMBERS_AS_STRINGS或自定义序列化器 - JDBC 入库时,多数数据库(如 MySQL、PostgreSQL)不支持 NaN/Infinity,可能转成
NULL或报错,务必在写入前校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










