以下程序输出结果为什么没有1.0?

来源:百度知道 编辑:UC知道 时间:2024/05/13 03:16:46
#include <stdio.h>
main()
{
float x;
for(x=0;x<=1.0;x+=0.1)
printf("%.1f",x);
}

float 类型的数据不能用 == 来判断 要用
x - 某数 < 一个精度
例如 你可以用 x - 1.0 < 0.0001 || x - 1.0 < -0.0001

//源程序改为
#include <stdio.h>
int main()
{
float x;
for(x = 0; x - 1.0 < 0.0001 || x - 1.0 < -0.0001; x += 0.1)
printf("%.1f ", x);
return 0;
}

#include <stdio.h>
main()
{
float x;
for(x=0;x<=1.0;x+=0.1)
printf("%1f",x);
}

计算机保存浮点型数据仅仅是近似值,比如第一次加上0.1后计算机保存的是 0.100000001,加10次之后是 1.00000012,很明显这个数比 1.0大,所以不会显示出来。
上述的值可通过程序调试看到,浮点型数据不能用严格相等的概念去测试。原因好像是二进制无法精确的保存小数。

因为十进制的0.1是无法用有限位数的二进制数准确表示的

十进制的0.1的二进制是0.0 0011 0011 0011....(重复无限多的0011)。

float类型是16位(或32位)二进制数,所以它是不能准确表示0.1的。

推荐LZ一本好书:汇编语言与计算机体系结构--使用C++和Java,看过第一章LZ就会非常清楚这个问题了。