为什么c语言中定义一个变量f=123.456,printf("%f",f)时结果是123.456001,我认为是123.456000,望高手解答

如题所述

float float,浮动的。:D

人类社会使用十进制,所以输入,输出都是按十进制来的。
而计算机中采用二进制,所以,你输入的数要转化为二进制存储。

十进制表面上的123.456,用二进制远不能用23个二进制比特位的尾码精确存储,只能四舍五入的转化为二进制存储。当取出时就不能还原原本的十进制123.456,这样就出现了浮点数的精确度问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-18
编译的时候有一个警告:
warning C4305: 'initializing' : truncation from 'const double' to 'float'意思是:不能将const double类型的值直接赋予float类型变量。对于这个问题您首先要搞清楚float型与double型的区别与联系了,float是单精度浮点型,而double是双精度浮点型,一般情况下,float是占4个字节,double占8个字节。你把f改为double型的,即double f=123.456;;就OK了,给您个小建议:以后用到小数类型的变量都把他们定义成double型的!这样不容易出错。希望对您有所帮助!
第2个回答  2012-07-18
可能你把它定义成float类型的,系统默认它是double型追问

是float 型的,,那为什么呢,能具体解释下吗?

追答

这个要用二进制来分析它的精度。 你网上搜搜吧

追问

哦ok thank you

追答

不用谢

第3个回答  2012-07-18
难道你定义的变量有问题? 按理不会出现这种情况,浮点是精确到小数点后6位,访问到未初始化内存了?追问

这个我也不清楚

追答

printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则
(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)
float型会被提升为double型。因此printf()只会看到双精度数。所以就是这个提升扩大了内存的范围,楼主把float换成double就不会出这个情况!

第4个回答  2012-07-18
你在什么环境下编写的程序?我在LINUX下打印的结果和你预想的是一样的追问

c-free

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网