很高兴成为 吾爱会员,发一个简单但对新手有理解作用的帖子。
在学习变量及其类型时,我们会接触到重要的实型变量,即单精度(float)双精度(double).
为什么会有"精度"一词?让我们看一段代码。
[C] 纯文本查看 复制代码 #include<stdio.h>
int main()
{
double a=0;
for(;a!=1;a+=0.1)
{
printf("%f\n",a);
}
return 0;
}
运行结果会是什么?
0.000000
0.100000
0.200000
0.300000
0.400000
0.500000
0.600000
0.700000
0.800000
0.900000
大部分人心中是这个答案,其实不然。
这个程序不会停止,会一直打印下去。
因为a不会等于1.
实型数据与整形数据的存储方式不同,实型数据是按指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。
列如:16.235=1.0146875*2^4
(第一次发帖)图片上传不上来 分3部分储存 +(符号) .0146875(尾数部分) 4(指数部分)
当小数部分过长,存储空间不足,就会截掉后面的部分,从而存储的只是约数。
我们让留小数30位,再看看
[C] 纯文本查看 复制代码 #include<stdio.h>
int main()
{
double a=0;
for(;a<1.1;a+=0.1)
{
printf("%0.30f\n",a);
}
return 0;
}
代码自己运行 可以看到
0.000000000000000000000000000000
0.100000000000000010000000000000
0.200000000000000010000000000000
0.300000000000000040000000000000
0.400000000000000020000000000000
0.500000000000000000000000000000
0.599999999999999980000000000000
0.699999999999999960000000000000
0.799999999999999930000000000000
0.899999999999999910000000000000
0.999999999999999890000000000000
1.099999999999999900000000000000
Press any key to continue
其中并没有1. 所以成语并不会停下来。
初来乍到,多多指教。
|