知易通
第二套高阶模板 · 更大气的阅读体验

浮点比较相等技巧:别再用 == 判断小数了

发布时间:2025-12-15 18:50:06 阅读:245 次

写代码时你有没有遇到过这种情况:两个看起来明明一样的小数,用 == 一比对,结果却是 false?比如 0.1 + 0.2 不等于 0.3。这可不是程序出 bug,而是浮点数的“老毛病”。

计算机底层用二进制表示数字,像 0.1 这样的十进制小数在二进制里是无限循环的,只能近似存储。这就导致计算结果存在微小误差。直接用 == 比较两个浮点数是否相等,往往得不到预期结果。

别硬刚,换种思路

与其判断“完全相等”,不如看两个数是不是“足够接近”。这就是常用的“容差法”——设定一个极小的阈值(比如 1e-9),如果两数之差的绝对值小于这个阈值,就认为它们相等。

double a = 0.1 + 0.2;
double b = 0.3;
double epsilon = 1e-9;

if (Math.abs(a - b) < epsilon) {
System.out.println("视为相等");
} else {
System.out.println("不相等");
}

这个方法在 Java、C++、Python 等语言里都适用。不同的是,Python 可以借助 math.isclose() 函数更方便地实现:

import math

a = 0.1 + 0.2
b = 0.3

if math.isclose(a, b):
print("相等")

实际场景别踩坑

比如你在写个记账小程序,用户输入一笔 0.7 元的支出,系统算出来是 0.3 + 0.4,结果存进去发现对不上账。问题就出在直接比较浮点数。这时候用容差判断,就能避免这种“肉眼看着一样,程序却说不同”的尴尬。

还有做图形渲染、科学计算、游戏物理引擎时,坐标、速度、时间这些数据经常是浮点数。频繁的计算会累积误差,必须用合理的比较方式,否则逻辑可能突然崩掉。

精度要求高的场景,比如金融计算,干脆不用 float 或 double,改用 BigDecimal 这类高精度类型,从源头避免问题。