问题所在
浮点型数据由于在计算机中不是精确存储的,所以直接用 ==
比较可能会得到不准确的结果。
如何解决?
正确的做法是比较两个浮点数的差值是否在一个很小的容忍范围内。可以通过下面的函数来实现:
static bool IsEqual(double a, double b, double epsilon = 1e-6) {
return std::abs(a - b) < epsilon;
}
这里的 epsilon
是一个很小的值,比如 1e-6
(即 (10^-6))。这个函数的作用是判断 a
和 b
的差值是否小于 epsilon
,如果是,则认为它们相等。
使用示例
#include <iostream>
#include <cmath>
bool IsEqual(double a, double b, double epsilon = 1e-6) {
return std::abs(a - b) < epsilon;
}
int main() {
double a = 0.1 + 0.2;
double b = 0.3;
if (IsEqual(a, b)) {
std::cout << "a 和 b 近似相等" << std::endl;
} else {
std::cout << "a 和 b 不相等" << std::endl;
}
return 0;
}
在这个示例中,由于浮点数精度问题,0.1 + 0.2
可能不完全等于 0.3
,但通过 IsEqual
函数比较它们的差值是否在 (10^-6) 的范围内,可以正确判断它们是否近似相等。
总之,比较浮点型数据时,不要直接用 ==
,而是要比较它们的差值是否在一个小的容忍范围内。