| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 445 人关注过本帖
标题:新生有问,希望大家帮助
只看楼主 加入收藏
wikais
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-31
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
新生有问,希望大家帮助
我上大一,学C    遇到这样一个问题,需大家帮我解释一下
#include <stdio.h>
main()
{
   int a=4321;
   float  f=123.456;
   printf("%f,%8f,%.2e\n",f,f,f);
 }
   为什么输出的是123.456001    123.456001      1.2e+02      001是为什么  还有1.2e+02   
                                        谢谢
搜索更多相关主题的帖子: 新生 
2010-11-04 21:26
gaochizhen33
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:114
专家分:101
注 册:2010-11-4
收藏
得分:2 
定义的类型不同 精度不一样 后边的就不太懂了 等高人
2010-11-04 21:30
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:6 
图片附件: 游客没有浏览图片的权限,请 登录注册

%f输出的是6位小数位不够会自动加上即是001,%8f是输出的数位数必须>=8,不够的需要以空格填充,%.2e是小数位保留2位,e+002表示的是的10的2次方,
2010-11-04 21:47
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:6 
多看下书,书上写的很清楚
2010-11-04 21:48
帝国
Rank: 3Rank: 3
来 自:云南昆明
等 级:论坛游侠
帖 子:68
专家分:144
注 册:2010-10-11
收藏
得分:6 
呵呵呵,回答的很有意思啊
其实这是一个精度的问题,浮点数的精度位是有限的,其只能保证一定程度的数字是有意义的,你可以尝试改变变量的赋值,比如:
float f = 12345.12345
float f = 123456.123
float f = 1234.1234
等等,用同样的方式输出,你就会发现一个规律,除了你明确的赋值外,还会输出一些额外的数(输出小数点要求的位数大于实际有效位数的情况下)。从理论上讲那些多出的位应该是全用0来填补,但是实际上这是无法做到的,这是由于浮点数在内存中的存储机制造成的,具体的原因不应该是你现在的能力应该讨论的,你只要记住,小数点后超过6位的数字都是没有意义的,这是一些随机值,如你上面的例子,小数点后只有3位有效数字,另外的三位是无效数字,那一个1是一个随机的值,没有任何意义,在浮点数变量的使用过程中要时刻记住他的有效位数。

记住你今天提的这个问题,任何程序设计语言都存在这个问题,不要尝试使用浮点数做太精确的时,会的到无法预测的结果。
2010-11-04 22:10
wikais
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-31
收藏
得分:0 
回复 5楼 帝国
  你说的很详尽,谢谢。
2010-11-05 07:04
wikais
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-31
收藏
得分:0 
回复 3楼 ou1111
我这个输出地是1.2e+002 小数点精确地是一位,你电脑上怎么是两位?
2010-11-05 07:08
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:0 
回复 7楼 wikais
额。。。我没有改动你的程序,我没记错的话,应该是两位小数的,你看看书吧,书上写的很清楚的
2010-11-05 07:47
t505556855
Rank: 2
等 级:论坛游民
帖 子:27
专家分:32
注 册:2010-10-31
收藏
得分:0 
以下是引用帝国在2010-11-4 22:10:13的发言:

呵呵呵,回答的很有意思啊
其实这是一个精度的问题,浮点数的精度位是有限的,其只能保证一定程度的数字是有意义的,你可以尝试改变变量的赋值,比如:
float f = 12345.12345
float f = 123456.123
float f = 1234.1234
等等,用同样的方式输出,你就会发现一个规律,除了你明确的赋值外,还会输出一些额外的数(输出小数点要求的位数大于实际有效位数的情况下)。从理论上讲那些多出的位应该是全用0来填补,但是实际上这是无法做到的,这是由于浮点数在内存中的存储机制造成的,具体的原因不应该是你现在的能力应该讨论的,你只要记住,小数点后超过6位的数字都是没有意义的,这是一些随机值,如你上面的例子,小数点后只有3位有效数字,另外的三位是无效数字,那一个1是一个随机的值,没有任何意义,在浮点数变量的使用过程中要时刻记住他的有效位数。
 
记住你今天提的这个问题,任何程序设计语言都存在这个问题,不要尝试使用浮点数做太精确的时,会的到无法预测的你也可以把单精度
你也可以把单精度转换为双精度型,会更加精确
2010-11-05 07:48
雾雨淼淼
Rank: 2
来 自:甘肃金昌
等 级:论坛游民
帖 子:85
专家分:89
注 册:2010-8-17
收藏
得分:0 
这关系到不同数据的精度不一样的问题了,float类型的数据要求在小数点后至少留有6位,可以通过添加数字来改变位数,例如:%.5f表示在小数点后面留5位小数。计算机计算数据的时候只能保证一定位数的精确度,.001就是那样产生的
2010-11-05 11:05
快速回复:新生有问,希望大家帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016286 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved