| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6301 人关注过本帖, 1 人收藏
标题:有时用float比double更精确
取消只看楼主 加入收藏
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:4 
有时用float比double更精确
前段时间在论坛上有位朋友用double类型写了一个工资分解成钞票数量的程序,我简化了一下,如下:
#include <stdio.h>
int main(void)
 {
     double sum;
     int num;
     double money[6]={100,50,10,5,0.5,0.1};
     printf("请输入实发工资总额\n");
     scanf("%lf",&sum);
     for (int i=0;i<=5;i++)
     {
         num=(int)(sum/money[i]);
         if(num>0)
         printf("%f元%d张\n",money[i],num);
         sum=sum-num*money[i];
     }
 }
输入2364.6
输出为:
100.000000元23张
50.000000元1张
10.000000元1张
0.500000元9张

而我将sum和money类型改为float后,程序如下:
#include <stdio.h>
int main(void)
 {
     float sum;
     int num;
     float money[6]={100,50,10,5,0.5,0.1};
     printf("请输入实发工资总额\n");
     scanf("%f",&sum);
     for (int i=0;i<=5;i++)
     {
         num=(int)(sum/money[i]);
         if(num>0)
         printf("%f元%d张\n",money[i],num);
         sum=sum-num*money[i];
     }
 }
输入:2364.6
输出为:
100.000000元23张
50.000000元1张
10.000000元1张
0.500000元9张
0.100000元1张
反而用float类型能输出完整。
用printf打印发现,用double类型时最后一次的num=0,而此时sum和money[i]都为0.10000,也就是说此时(int)(0.10000/0.10000)==0。
而用float类型则无此现象。在这个方面似乎float类型比double类型更精确。
也许大神有更好的解释。
搜索更多相关主题的帖子: include double money 朋友 
2016-10-02 12:00
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 3楼 linlulu001
没区别呀,结果都一样25.
2016-10-02 18:19
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 2楼 rjsp
刚才我试了下,若定义sum为float型,输入3564.6,用%.15f格式打印输出为3564.600097656250000比原值大但不够精确。
而如果定义sum为double型,输入3564.6,用%.15f格式打印输出为3564.599999999999900比原值小但更精确。
这就解释了为什么用单浮点数定义能得到正确结果,而双精度型反而不行。
如果输入sum后加个0.0000000001,也能得到理想的结果,而且每项精度都比float型高得多。
谢谢你的提点。
2016-10-02 19:24
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 6楼 linlulu001
谢谢你,我在scanf("%f",&sum);
后面加了句printf("%.15f\n",sum);
然后在循环里加了句printf("%.15f %.15f\n",sum,money[i]);
如果sum和money数组都定义为double型,则显示如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

如果sum和money数组都定义为float型,则结果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

我想这两张图能很好的说明问题了。
再次谢谢你的回复!
2016-10-02 22:10
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
输出不用%lf好像也不会出错,但输入非加不可,不然结果都是零。
2016-10-02 22:33
快速回复:有时用float比double更精确
数据加载中...
 
   



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

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