Double包装类的.equals()方法能否正确判断浮点数的相等性?
Double包装类equals方法浮点相等性判断说明
先说结论:你给出的示例代码能得到true的结果,但这不代表Double.equals()可以通用解决浮点类型的相等比较问题。
底层逻辑说明
Double.equals()的底层实现是将两个包装类对应的浮点值转换为二进制long位进行全等比较,只有两个浮点值的二进制表示完全一致时才会返回true。- 示例中两个变量都是直接赋值字面量
5.05,同一个字面量解析得到的浮点值二进制完全一致,因此比较结果为true。
存在的问题
浮点比较的核心风险来自浮点值本身的存储舍入误差,和用==还是equals无关。比如下面的代码就会返回false:
Double a = 0.1 + 0.2; Double b = 0.3; boolean test = a.equals(b); // 实际返回false
因为0.1 + 0.2的计算结果实际是0.30000000000000004,和字面量0.3的二进制存储完全不同。
另外还要注意特殊值的差异:基本类型判断中0.0 == -0.0会返回true,但Double.valueOf(0.0).equals(Double.valueOf(-0.0))会返回false,二者对正负零、NaN的判断逻辑存在区别。
正确的浮点比较方案
不管是基本类型的==还是包装类的equals,都不适合直接做业务场景的浮点相等判断,推荐设置可接受的误差阈值进行判断:
// 阈值根据实际业务精度要求调整,这里示例为1e-9 double epsilon = 1e-9; boolean isEqual = Math.abs(a.doubleValue() - b.doubleValue()) < epsilon;
内容的提问来源于stack exchange,提问作者Hat
相关产品推荐
相关产品推荐

