C语言小问题,救命~~

来源:百度知道 编辑:UC知道 时间:2024/07/07 13:47:57
问题2:
double dou()
{return 153.9;}
main()
{ float s;
s=12.34;
printf("%f ",s=dou()); /* double的153.9赋给float变量 */
printf("%f ",s); /* 应该不会存在误差吧,请教。 */
getch();
}
按理输出的两个值应该相等
为什么输出153.900000 153.899994而不是153.900000 153.900000
与输出格式无关,就算换成%lf结果也一样,困惑

好像你问了两遍:
你这个问题如果想说明白其实还是挺复杂的,
如果是初学者,不建议深究。

简单的讲一下吧:
printf("%f ",dou());
这个比较简单,
dou()直接返回常量值,所以就等于printf("%f ",153.9);
153.9以浮点形式输出,有效小数位6位,所以输出为153.900000

printf("%f ",s);
这里有一个变量赋值的问题,将153.9赋值给s,再读取s的值输出,
这之间有一个浮点数存储的过程,
将常量区的153.9赋值给栈区的变量s,
但是计算机保存浮点数时,
是把数看作a*(2^b)这样的形式的,而不是我们直观上认为的以10为底数,
在计算机内部处理时是以2为底数的。
即将数转换成以2为底的“科学计数法”的形式,
再由这个形式反转换成10进制形式,
但是由于数据有位数的限制(例如6位),
所以有些数转换成二进制计数形式后位数超出了限制的位数,那么超出的位就被截去了,那么转换回来时得到的数就会与原数有偏差,不同的数这个偏差是不同的,
所以这里就变成了153.899994

是不是因为你上面是double类型的?下面是float的?