两个浮点数如何判断相等
1. 问题根源
浮点数在计算机中是近似表示的,由于精度限制,直接比较 == 可能导致意外结果。
错误示例:
float a = 0.1 + 0.2;
float b = 0.3;
if (a == b) { /* 这个条件可能不成立 */ }
2. 正确做法:使用容差比较(epsilon)
#include <cmath>
#include <iostream>bool areEqual(float a, float b, float epsilon = 1e-6) {return std::abs(a - b) < epsilon;
}int main() {float a = 0.1 + 0.2;float b = 0.3;if (areEqual(a, b)) {std::cout << "Equal!" << std::endl;} else {std::cout << "Not equal!" << std::endl;}return 0;
}
3. 为什么需要容差?
- 浮点数的精度有限(例如,IEEE 754单精度浮点数有约7位有效数字)
- 0.1 和 0.2 无法精确表示,它们的和可能略小于 0.3
- 通过容差比较,我们允许一个很小的误差范围
4. 更高级的比较方法(相对误差)
对于非常大的浮点数,使用绝对误差可能不合适,应该使用相对误差:
bool areEqual(float a, float b, float epsilon = 1e-6) {// 处理非常小的数字if (std::abs(a - b) < epsilon) {return true;}// 相对误差比较return std::abs(a - b) < epsilon * std::max(std::abs(a), std::abs(b));
}
5. 特殊情况处理
- 比较0:当比较接近0的值时,使用绝对误差
- 比较大数:当比较很大的值时,使用相对误差
