也可以想一下,0.9无限循环不是等于1吗
如果正好某个值等于0.9循环,浮点数只能给出一个“确定”的值,那就会“做错题”。
我想原理大约是这样的。具体的嘛,我还没有弄清楚 :)
再经过搜索后,写下如下一段话:
好了,终于找到不完整的答案了。反正我是绝不会再将浮点数直接比较了:
我参照这篇文章写了这个例子:
#include
#include
main()
{
float d1, d2, d3, d4;
d1 = 194268.02;
d2 = 194268;
d4 = 0.02;
d3 = d1 - d2;
if (d3 > d4)
printf(">0.02/n");
else if (d3 < d4)
printf("<0.02/n");
else
printf("=0.02/n");
printf("%f - %f = %f /n", d1,d2,d3);
system("pause");
}
请看结果:
<0.02
194268.015625 - 194268.000000 = 0.015625
即:194268.02 - 194268.0 不等于 0.02!
存进去的数居然会变!怕了吧
4个变量改成double型的,再测试:
这是结果
<0.02
194268.020000 - 194268.000000 = 0.020000
明明是0.02啊,怎么还是小于
这次没有改我存的数了吧 WHY
我说,我怕了,以后我再不敢用浮点数直接作相等比较了!
还是那句话:浮点数都是有精度限制的。
所以你存的数,不一定就是你要的数。
虽然这件事很值得郁闷,不过我还是很高兴又知道了点东西。
关于EPSINON,可不是能随便定义的!
而且应该能想到,double和float的EPSINON是不同的。
定义成什么呢 不必你去定义了,ANSI C已经定义了这些常量:
载入头文件
#include
就可以引用
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
几个常量了。