C++中double类型数据比较大小

563 阅读1分钟

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;
}

p1p2本应是相等的,但是由于double类型的精度问题,导致输出结果如下所示:

image.png

解决方法

在比较 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;
}

输出得到了目标结果:

image.png