C++中double类型数据比较大小
直接比较可能会出现精度问题
比如下面这个例子:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double d1 = 0.2 * 0.2;
double d2 = 0.2 * 0.2 * 0.2;
double p1 = pow(d1, 1.0 / 2.0);
double p2 = pow(d2, 1.0 / 3.0);
printf("%.21lf\n%.21lf\n", p1, p2);
if(p1 == p2) {
printf("Equal\n");
} else {
printf("Not equal\n");
}
return 0;
}
p1
和p2
本应是相等的,但是由于double
类型的精度问题,导致输出结果如下所示:
解决方法
在比较 double
类型数据的大小时,最好不要使用等于、不等于、大于、小于比较运算符,而是使用一个误差范围来判断两个数的大小关系,示例代码如下:
#include <iostream>
#include <cmath>
using namespace std;
bool isEqual(double p1, double p2) {
double epsilon = 0.0001;
return fabs(p1 - p2) < epsilon;
}
int main() {
double d1 = 0.2 * 0.2;
double d2 = 0.2 * 0.2 * 0.2;
double p1 = pow(d1, 1.0 / 2.0);
double p2 = pow(d2, 1.0 / 3.0);
printf("%.21lf\n%.21lf\n", p1, p2);
if(isEqual(p1, p2)) {
printf("Equal\n");
} else {
printf("Not Equal\n");
}
return 0;
}
输出得到了目标结果: