永发信息网

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

答案:6  悬赏:0  手机版
解决时间 2021-03-27 21:03
  • 提问者网友:佞臣
  • 2021-03-27 15:13
为什么c语言中定义一个变量f=123.456,printf("%f",f)时结果是123.456001,我认为是123.456000,望高手解答
最佳答案
  • 五星知识达人网友:思契十里
  • 2021-03-27 16:28
float float,浮动的。:D

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

十进制表面上的123.456,用二进制远不能用23个二进制比特位的尾码精确存储,只能四舍五入的转化为二进制存储。当取出时就不能还原原本的十进制123.456,这样就出现了浮点数的精确度问题。
全部回答
  • 1楼网友:躲不过心动
  • 2021-03-27 19:57
不知道,高手来回答
  • 2楼网友:刀戟声无边
  • 2021-03-27 19:01
可能你把它定义成float类型的,系统默认它是double型追问是float 型的,,那为什么呢,能具体解释下吗?追答这个要用二进制来分析它的精度。 你网上搜搜吧追问哦ok thank you追答不用谢
  • 3楼网友:舍身薄凉客
  • 2021-03-27 18:51
你在什么环境下编写的程序?我在LINUX下打印的结果和你预想的是一样的追问c-free
  • 4楼网友:举杯邀酒敬孤独
  • 2021-03-27 17:18
难道你定义的变量有问题? 按理不会出现这种情况,浮点是精确到小数点后6位,访问到未初始化内存了?追问这个我也不清楚追答printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则
(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)
float型会被提升为double型。因此printf()只会看到双精度数。所以就是这个提升扩大了内存的范围,楼主把float换成double就不会出这个情况!
  • 5楼网友:迷人又混蛋
  • 2021-03-27 16:41
编译的时候有一个警告:
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型的!这样不容易出错。希望对您有所帮助!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯