浮点数会有微小的误差,不应该直接用==判断浮点数的相等,应该用如下的方法:
if(fabs(x-y)<1e-6) puts("相等");
即,如果两个浮点数之差小于一个很小的数(例如这里的1e-6,也就是0.000001),就认为它们是相等的,fabs()用于求绝对值,避免差小于0 ,它的声明在math.h文件中
#include
void main(void)
{
double x,y;
x=0.12;
y=0+0.1+0.02;
if(x-y<0.000001 && x-y>-0.000001)
{
printf("%f=%f\n",x,y);
}
else
{
printf("%f≠%f\n",x,y);
}
}
用绝对值也行 ,double好像精度更高一些,我这个是适合float的,double自己查查
因为y=0+.. 后面其他不考虑
y是double型的 而0是int型的 编译器将0转换成double型
而计算机中的0并不是真正我们意义上的0 有时候他是0.0000000000000001若干个0后面还是有个1的
所以导致最后结果不相等
所以在某些要求精度较高的情况下 会单独做一个compare函数来比较2个数是否相等 函数内部会对比较的数进行一定位数的四舍五入 比如精确到小数后7位
精度类型的是不能直接做相等比较的,这是基础的语法点,任何一本教科书都会涉及到。
我唯一想到的可能出问题的地方是:y=0+0.1+0.02; 里的整形 0在转换成double时出现的误差导致了计算结果的错误,而这误差实在显示精度之外,所以才会得出0.120000!=0.120000
个人想法
浮点数计算是有误差的,把x,y四舍五入再比较,或者干脆用定点数.