C语言小小小问题,渴望同学们的热心帮助~~~

来源:百度知道 编辑:UC知道 时间:2024/05/27 11:41:49
运行环境:Win-TC2.0

不情之请:问题虽小,但不简单。有劳同学们亲手调试一下,再回答,感激!

问题1:
main()
{ float s=153.9; /* s=1.9却正常输出1.900000,困惑! */
printf("%f",s);
getch();
}
为什么输出153.899994而不是153.900000,153.9没有超过数值范围和有效位数啊.连153.9这样的浮点数都不精确,浮点型数据存在这么大的误差,还能用?

问题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结果也一样,困惑

问题3:
double dou()
{return 153.9;}
main()
{ float s;
s=dou();
printf("%f ",dou()); /* 明明用了%f的格式输出 */
printf("%f ",s); /* 为什么两次输出不一样 */
getch(); /* 换成%lf,也无法解决 */
}

直接定义的浮点数字和计算中间结果的浮点数字的精确度是不一样的.
直接定义的浮点数字精度就是你定义的数据类型float的精度.
而作为函数返回值的数字(作为计算中间结果)通常是用的最高的精度.
那么,153.899994可能是float,二
153.900000应该是double

这是计算机存储数据的问题,不是你的问题,小数在计算机中是无法精确表示的,所以显示有误差

float 的有效数位只有9位,再多就不能精确显示了。
double 则有十几位。
TC VC6 下都一样的,所以若想准确,就转换成double吧

浮点数本身就是近似值,这是由计算机的存储形式决定的。
要想正确(或者说精确)那就用double型。

都是因为超过127了,你 的数本身不该用double,要是位数够肯定不会错,就好比你拿一个100V档去测两伏一样,误差就出来了,计算机在处理的 时候是把各种进制转换成二进制再进行转换的,这当中肯定是有误差的。除非正好可以转换,不然总是有误差的 啊。
就变成那个样子了