NaN和Infinity不能用==或!=比较,须用Double.isNaN()、Double.isInfinite()、Double.isFinite()等专用方法;正负无穷需结合isInfinite()与符号判断。

Java 中浮点数的 NaN(Not-a-Number)和 Infinity(无穷大)不是普通值,不能用 == 或 != 直接比较,必须用专用方法判断。
用标准方法判断 NaN 和 Infinity
Java 提供了 Double 和 Float 类的静态方法,这是最可靠、推荐的方式:
-
Double.isNaN(double v):判断是否为 NaN。注意Double.NaN != Double.NaN恒为true,所以绝不能写x == Double.NaN。 -
Double.isInfinite(double v):判断是否为正无穷或负无穷(即Double.POSITIVE_INFINITY或Double.NEGATIVE_INFINITY)。 -
Double.isFinite(double v)(Java 8+):判断是否为有限值(既不是 NaN,也不是 Infinity),等价于!Double.isNaN(v) && !Double.isInfinite(v)。
区分正负 Infinity
如果需要单独判断是正无穷还是负无穷,可以结合 isInfinite() 和符号判断:
-
v > 0 && Double.isInfinite(v)→ 正无穷 v → 负无穷- 或者直接用
v == Double.POSITIVE_INFINITY(此时==是安全的,因为 Infinity 是唯一常量)
注意:Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY 为 true,但 Double.NaN == Double.NaN 仍为 false。
立即学习“Java免费学习笔记(深入)”;
常见来源与预防建议
NaN 和 Infinity 通常来自数学异常操作:
-
NaN 示例:
0.0 / 0.0、Math.sqrt(-1.0)、Double.parseDouble("abc")(抛异常,但若捕获后返回默认值需留意) -
Infinity 示例:
1.0 / 0.0→POSITIVE_INFINITY;-1.0 / 0.0→NEGATIVE_INFINITY - 做除法前检查分母是否为零(尤其当分母来自用户输入或计算结果时)
- 对可能溢出的运算(如指数、对数、开方)加保护逻辑,或使用
Math.getExponent()分析数值范围
在业务逻辑中安全处理
遇到 NaN 或 Infinity 时,应明确语义再决定行为:
- 统计场景(如平均值):过滤掉 NaN/Infinity,或按业务规则替换为默认值(如 0 或 null)
- 前端展示:转成字符串时,
String.valueOf(Double.NaN)返回"NaN",String.valueOf(Double.POSITIVE_INFINITY)返回"Infinity",可提前拦截并显示友好提示 - 序列化(如 JSON):某些库(如 Jackson)默认将 NaN/Infinity 序列化为无效 JSON,需配置
JsonGenerator.Feature.WRITE_NAN_AS_STRINGS或自定义序列化器


















