直接用 == 比较两个 double 几乎总是错的,因为 0.1 等十进制小数在 IEEE 754 double 中无法精确表示,导致计算结果存在微小误差,如 0.1 + 0.2 != 0.3。

C++解决浮点数精度丢失问题 _ 比较两个double是否相等技巧【详解】

先说一个核心判断:直接用 == 比较两个 double,在绝大多数情况下都是错的。这不是你代码写错了,而是 0.1 在内存里根本存不准——它被截断成二进制近似值后,两次计算哪怕路径稍有不同,结果就可能落在相邻的两个可表示浮点数上。

为什么 a == b 在浮点数里不可靠

IEEE 754 double 只有 52 位尾数,能精确表示的十进制小数屈指可数。像 0.1 + 0.20.3 这两个值,在内存中是两个不同的 bit 模式,== 判断自然为 false。这不是 bug,是标准行为。

用什么阈值判断“足够接近”

没有万能 eps。选错阈值会导致漏判(该相等的说不等)或误判(该不等的说相等)。关键看数值量级和使用场景:

别把浮点数当 key 或控制循环变量

哈希表用 doublekey?循环条件写 while (x != 1.0)?这两类操作在工程中基本等于埋雷。

输出格式 ≠ 存储精度

std::fixedstd::setprecision 只改显示,不改内存里的值。你以为打印出 0.30 就“修复”了,其实参与下一轮计算的还是那个不等于 0.3 的数。

真正难的不是写个 abs(a-b) < eps,而是判断这个 eps 该取多大、在哪一层做归一化、要不要提前截断输入、以及团队里所有人都得避开用浮点数做逻辑分支或索引——这些细节一旦漏掉一个,问题就会在某个特定数据组合下突然爆发。

本文转载于:https://www.php.cn/faq/2334266.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。