注:以下代码运行环境为32位机,Visual studio环境
代码块1
main()
{
double f=34.6;
f=f-34;
printf("%lf",f);
}
代码块1 结果
代码块2
main()
{
float f=34.6;
f=f-34;
printf("%f",f);
}
代码块2 结果
代码1与代码2的差别在于变量 f 的数据类型,数据0.6有效数字位数为1位(0.6亦可表示为6*10-1,这里与小数点后多少位不同,同学们可以老回忆一下C语言中float和double类型的精度范围),但即使是float类型也有6—7位的有效数字,为什么在表示0.6时会出现误差?问题是在进制转换时所有的数值并不是一 一对应的。
那么,既然不是一 一对应的,为什么换成double就正确了?其实是这样的,double的有效位数是15-16位。我们更换代码如下:
代码块3
main()
{
double f=34.6;
f=f-34;
printf("%20.16lf\n",f);
}
此处,f的数据类型为double,输出时控制小数点后显示16位。
代码块3 结果
也就是说double时的结果其实也不是精确的。因此同学们要正确理解数字计算机的数度高这一特点。