在浮点数比较的时候,可不可以使用==进行比较?
首先,浮点数存储的时候,存在精度损失,大多浮点数不是一个精确表示的数。
下面我们先看一个例子:
int main()
{
double a = 1.0;
double b = 0.9;
if ((a - b) == 0.1)
{
printf("equal");
}
else
{
printf("not equal");
}
return 0;
}
a等于1.0,b等于0.9,我们答应出来是否等于0.1呢?
代码运行后,显然不相等,根据我们的常识来说1.0-0.9怎么可能不等于0.1呢?
我们想进一步得到他们的根本,浮点数是有精度的,是不是小数点后面的值不一样呢,我们将a、b、a-b和0.1的值都打印出来,我们可以将小数点后保留30位。
int main()
{
double a = 1.0;
double b = 0.9;
printf("%.30lf\n",a);
printf("%.30lf\n",b);
printf("%.30lf\n",a-b);
printf("%.30lf\n",0.1);
if ((a - b) == 0.1)
{
printf("equal");
}
else
{
printf("not equal");
}
return 0;
}
a-b!=0.1
浮点数在存储过程中存在精度损失,会另结果有细微差别。
我们可以看到a-b的值大约是0.09,而不是0.1
当到这里我们就已经知道问题出在哪里了,由精度所导致的误差
所以我们到底该怎么比较呢,代码又该如何写出呢?
我们可以自己来规定精度, 引入一个绝对值函数
#include<stdio.h>
#include<math.h>
int main()
{
double a = 1.0;
double b = 0.9;
double t = fabs((a - b) - 0.1);
if (t<0.00000000000001)
//指定一个精度,两个数相减,绝对值比0.00000000000001还要小,证明这几乎就是相等了
//不能像开始时一样,写是否等于0.1,应该通过相减的绝对值,在指定一个精度
{
printf("equal");
}
else
{
printf("not equal");
}
return 0;
}
我们可以运行一下程序
此时结果相等
总结:浮点数不能直接通过等号作比较,你要自定义一个精度,然后做减法取绝对值。