Java中不能用==判断浮点数相等,因二进制存储导致精度丢失(如0.1+0.2!=0.3);应采用误差范围法,即判断Math.abs(a-b)<epsilon(如1e-6)。

Java 中不能直接用 == 判断两个浮点数是否“数学上相等”,因为浮点数在计算机中以二进制形式存储,存在精度丢失问题。例如 0.1 + 0.2 != 0.3(结果为 false)。正确做法是判断它们的差值是否小于一个极小的阈值(即“误差范围”)。
使用误差范围(epsilon)比较
这是最常用、最直观的方式:计算两数之差的绝对值,看是否落在可接受的误差范围内。
- 定义一个足够小的正数
epsilon,如1e-6(适用于大多数普通精度场景) - 写法:
Math.abs(a - b) - 注意:
epsilon的大小需根据业务场景调整——科学计算可能要1e-15,而图形渲染可能允许1e-3
使用 Double.compare() 或 Float.compare()
该方法用于**排序或判等逻辑中需处理 NaN 和 ±0 的边界情况**,它按 IEEE 754 规则比较:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Double.compare(a, b) == 0表示 a 和 b 数值相等(且都非 NaN) - 它把
NaN视为最大值,-0.0和+0.0视为相等 - 但注意:它不提供误差容忍,是严格数值比较,仍无法解决
0.1+0.2==0.3这类精度问题
使用 BigDecimal 进行精确比较(适合金融/高精度场景)
当需要完全避免浮点误差(如金额计算),应改用 BigDecimal,并确保用字符串构造(避免 double 构造器引入初始误差):
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
new BigDecimal("0.1").add(new BigDecimal("0.2")).equals(new BigDecimal("0.3")) - ❌ 错误:
new BigDecimal(0.1)—— 此时 0.1 已经是不精确的 double 字面量 - 比较用
equals()(注意它会比较值和精度,若需忽略精度差异可用compareTo() == 0)
推荐实践总结
日常开发中,优先选择带 epsilon 的比较;涉及金额、配置校验等对精度敏感的场景,从源头改用 BigDecimal;仅在需要兼容 NaN/±0 且无需容错时才考虑 Double.compare()。没有银弹,关键是根据场景选合适工具。

















