| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2638 人关注过本帖, 1 人收藏
标题:关于单精度实型float输出时的问题
只看楼主 加入收藏
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
结帖率:100%
收藏(1)
 问题点数:0 回复次数:4 
关于单精度实型float输出时的问题
void main()
{
    float f1=123.456;
    printf("f1=%f,f1=%7.2f,f1=%-7.2f,f1=%e,f1=%g\n",f1,f1,f1,f1,f1);
    getch();
}
输出结果是f1=123.456001,f1=口123.46,f1=123.46口,f1=1.23456e+02,f1=123.456。(其中口代表空格,getch()是编译环境win-tc必加的一句)
请问:1,为什么第一个f1输出的不是123.456而是123.456001,后面为什么还有001?而书上多的是000。
      2,为什么第二个和第三个的f1输出是舍去了5?怎么数值不是123.45而是123.46?
      3,在C语言中有条“就长不就短”的自动转换原则,即当运算时参加运算的数据都转换成最长的数据类型。OK,那当遇到数据长度一样,但类型不一的时候怎么办呢?比如遇到long和float运算时该怎么转换?
搜索更多相关主题的帖子: 输出 实型 float 单精度 
2009-09-23 21:51
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
我说说我的理解吧,也许有错误,谨作参考:
1, float 只保证结果为 7 位有效,所以在 7 位以后出现什么数字都是可能的;
2,四舍五入;
3,自动转换为长类型,其实程序中的所有程序在计算机进行运算的时候都转换为 double 型。
2009-09-23 22:05
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 楼主 pgy
首先谢谢了!
第一个问题你只回答了一半,非有效位随机产生我懂了,但为什么第一个f1不是输出123.456?后面为什么还要随机产生3位数呢?
第二个问题懂了(第5位上的5是由原来的6进到4上得出的)。
第三个问题,你的意思是不是说无论是什么数据类型,在运算的时候都先临时转换成双精度实型,然后再计算,如果是这样,那为什么还要有“就长不就短”的原则呢?而且这样转换的话,不就浪费临时内存了么?比如2个字符型的运算,都本来只要1个字节,但却要搞出空间临时存为8字节?好浪费啊!
希望能再解释清楚点,谢谢!

我可好玩啦...不信你玩玩^_^
2009-09-24 00:07
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
我再来试着回答一下:
1,因为 C 语言 的 %f 默认输出 6 位小数;
3,据我的理解,所有数据在运算的时候都要转化为 double 型,这是因为其如果类型不一致会导致运算结果更加的不准确。
2009-09-24 01:26
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 4楼 广陵绝唱
恩,懂了,信任了,谢谢!
google出来了= =!没给分的帖子是不用结贴的,哈,以后都不给分咯,睡觉

[ 本帖最后由 pgy 于 2009-9-24 02:08 编辑 ]

我可好玩啦...不信你玩玩^_^
2009-09-24 01:51
快速回复:关于单精度实型float输出时的问题
数据加载中...
 
   



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

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