不能直接用 == 比较两个 double,因为浮点数在二进制中无法精确表示大部分十进制小数,如 0.1 + 0.2 ≈ 0.30000000000000004,导致 == 返回 false;应使用 Math.abs(a - b) < epsilon 判断近似相等。
为什么不能直接用 == 比较两个
double
因为浮点数在二进制中无法精确表示大部分十进制小数,
0.1 + 0.2
不等于
0.3
,而是约
0.30000000000000004
。直接用
==
会返回
false
,哪怕数值“看起来一样”。这不是 Java 特有,是 IEEE 754 浮点规范决定的。
用
Math.abs(a - b) 是最常用做法
这是判断近似相等的通用模式:计算差值的绝对值,看是否小于一个极小阈值(epsilon)。关键在于选对
epsilon
:
固定阈值如
1e-6
适合数量级已知、误差范围可控的场景(比如物理模拟中单位是米)
若
a
和
b
可能很大(如
1e10
)或很小(如
1e-20
),固定
epsilon
会失效——此时该用相对误差:
Math.abs(a - b)
Java 标准库没提供开箱即用的相对误差比较,
Double.equals()
仍走
==
,不可用
BigDecimal
不是万能解,但适合确定精度的场景
当业务要求“必须精确到小数点后两位”(比如金额),
BigDecimal
才是正解。但它不解决“近似”问题,而是避免浮点误差本身:
构造时别用
new BigDecimal(double)
,会继承
double
的二进制误差;改用
new BigDecimal("0.1")
字符串构造
compareTo()
返回
0
表示数学上严格相等,
equals()
还会比较精度(
new BigDecimal("1.0").equals(new BigDecimal("1"))
是
false
)
性能比
double
差很多,高频计算场景慎用
注意
NaN
和无穷大带来的陷阱
Double.NaN == Double.NaN
是
false
,所有涉及
NaN
的
==
或
Math.abs()
都会出错:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
先用
Double.isNaN(a) || Double.isNaN(b)
检查,再做差值比较
Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY
是
true
,但
Math.abs(a - b)
在无穷大相减时会得
NaN
,导致误判
如果业务允许无穷大参与比较,需单独分支处理:
Double.isInfinite(a) && Double.isInfinite(b) && Math.signum(a) == Math.signum(b)
浮点比较真正麻烦的不是写法,而是得时刻想清楚:你到底在比“误差是否可接受”,还是“业务上是否应视为同一值”。选错策略,测试可能刚好过,上线后在某个数量级上突然翻车。