(0).我们来看一个程序
#include <stdio.h>
int main(){
double a;
scanf("%lf",&a);
printf("a = %lf",a);
if(4.6 / 2 == a){
printf("equal!\n");
}
else{
printf("not equal!\n");
}
}
(1)运行结果
可以看出,我们输入的2.3和计算出来的(4.6 / 2)相等,这个没有问题。但是如果遇到下面这个问题:
(3)我们再来看一段程序:
#include <stdio.h>
#include <math.h>
#define eqs 1e-8
#define equal(a,b) ( (fabs((a) < (b))) < (eqs))
int main(){
double a = 4*asin(sqrt(2.0) / 2);
double b = 3*asin(sqrt(3.0) / 2);
if(a == b) printf("eauql!\n");
else printf("not equal!\n");
if(equal(a,b)) printf("equal!\n");
else printf("not equal!\n");
}

什么!?运行结果竟然出现“not equal”和“equal!”这是怎么回事儿?
(5)总结
a.这是因为在存储浮点数的时候,并不是按照我们想象中那么存储的,比如对于数浮点数2.3,可能存储的结果是:2.2999……99或者是2.3000……001,但就不会是2.300000</p><p>我们来看一个小实验:

就可以看到这里的浮点数2.3存储结果却是2.299……998!=2.3
b.正是因为这么一点小误差,导致在最后计算的时候,出现了不能判断是否真的具有相等的性质。
c.那么我们该怎么判断两个实际相等的数呢?请看下面的这个程序:
#define eqs 1e-8
#define equal(a,b) ( (fabs((a) < (b))) < (eqs))
这里的fabs()是C语言中求解绝对值函数。我们只要设定一个阈值,就可以解决浮点数的比较问题,一般这个阈值设置为1e-8