double.compare() 是 java 中专为浮点数排序设计的可靠工具,明确定义 nan、±∞ 与普通数值的大小关系,支持 treeset 有序插入;它基于位模式比较,-0.0 与 +0.0 视为相等,nan 与 nan 也返回 0,但不解决精度误差问题。

Double.compare() 是 Java 中专为浮点数排序设计的可靠工具,它把 NaN、+∞、−∞ 和普通数值之间的大小关系明确定义,避免了用
NaN 在 compare 中被统一视为“最大值”
当参与比较的两个 double 值中有一个是 NaN,规则如下:
- Double.compare(Double.NaN, x) 返回正数(x 是任意有限数或 ±∞)
- Double.compare(x, Double.NaN) 返回负数(x 是任意有限数或 ±∞)
- Double.compare(Double.NaN, Double.NaN) 返回 0(NaN 与自身相等)
这意味着在升序排序中,所有 NaN 会自动排在末尾;降序时则排在开头。不需要额外过滤或预处理。
+∞ 和 −∞ 的位置固定且符合直觉
Double.compare 严格按 IEEE 754 规范解释无穷大:
- Double.POSITIVE_INFINITY 被视为比所有有限数和 −∞ 都大
- Double.NEGATIVE_INFINITY 被视为比所有有限数和 +∞ 都小
- Double.compare(Double.NEGATIVE_INFINITY, 0.0) 返回负数
- Double.compare(0.0, Double.POSITIVE_INFINITY) 返回负数
所以自然排序下,结果顺序为:−∞ < 有限数 < +∞ < NaN(若存在)。
配合 Comparator 实现稳定排序
在实际集合排序中,直接复用 Double::compare 最简洁:
- List
list = Arrays.asList(1.0, Double.NaN, -5.0, Double.POSITIVE_INFINITY); - list.sort(Double::compare); // 升序:[-5.0, 1.0, ∞, NaN]
- list.sort((a, b) -> -Double.compare(a, b)); // 降序:[NaN, ∞, 1.0, -5.0]
TreeSet
注意:它不解决精度误差,只解决“表示一致性”
Double.compare 判断的是位模式是否一致,不是数学近似相等。比如:
- Double.compare(-0.0, +0.0) 返回 0(视为相等)
- Double.compare(Double.NaN, Double.NaN) 返回 0(唯一特例)
- 但 0.1 + 0.2 和 0.3 仍会被判为不等(因二进制舍入不同)
若需容忍计算误差,仍得用 Math.abs(a - b)










