众所周知,0.1+0.2≠0.3,那么,该如何编程呢?
#include<stdio.h>
#include<float.h>
#define DBL_EQ(a,b) (fabs((a)-(b))<DBL_EPSILON)
int main()
{
double a=0.1,b=0.2;
if(a+b==0.3){
printf("equal\n");
}else{
printf("not equal\n");
}
if(fabs(a+b-0.3)<DBL_EPSILON){
printf("equal\n");
}else{
printf("not equal\n");
}
if(DBL_EQ(a+b,0.3)){
printf("equal\n");
}else{
printf("not equal\n");
}
return 0;
}
需要包含float.h头文件。
本示例程序分三段,第一段是错误的,第二段是正确的,第三段是简便写法。
对应于double的是DBL_EPSILON
对应于float的是FLT_EPSILON
还有对应于long double的LDBL_EPSILON
至于为什么0.1+0.2≠0.3,用以下程序简单说明:
#include<stdio.h>
int main()
{
printf("%.20f\n",0.1);
printf("%.20f\n",0.2);
printf("%.20f\n",0.1+0.2);
printf("%.20f\n",0.3);
return 0;
}
比较第三行和第四行的输出。
0.10000000000000000555
0.20000000000000001110
0.30000000000000004441
0.29999999999999998890
[Process completed - press Enter]
总结
两个浮点数判断相等,不能直接用==,需要和XXX_EPSILON比较才可以。