免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1808 | 回复: 9
打印 上一主题 下一主题

请高手帮忙看看问题出在哪?谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-24 17:19 |只看该作者 |倒序浏览
小弟写了个函数,结果出一问题让我很费解.请高手帮忙看看.
int main()
{
    double  out=0.00;

    out=16.985;

    printf("1111 [%.5f]\n", out);
    turn_money(&out);
    printf("2222 [%.5f]\n", out);

    return 0;
}
int turn_money(double *mon)
{
    int i,adjust0;
    double adjust1;
    double tmp=0.00;

    adjust0=1;
    adjust1=0.5;

    i=2;
    while ( i != 0 )
    {
                 adjust0=adjust0*10;
                 adjust1=adjust1*0.1;
                 i--;
    }

    *mon=floor( (*mon + adjust1) * adjust0 ) / adjust0;
    return 0;
}
结果打印出结果我晕了.
1111[16.98500]
2222[16.98000]

其实就相当于  floor( (16.985 + 0.005) * 100 ) / 100  = 16.98
另外我用out=16.885,得出的结果就对[16.89],等等我换了N个数,只有16.985错.
请高手帮看看,谢谢!!!

[ 本帖最后由 guaiguaixo 于 2008-12-24 17:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-24 17:22 |只看该作者
floor 是什么函数?

论坛徽章:
0
3 [报告]
发表于 2008-12-24 17:23 |只看该作者
晕,向下取整

论坛徽章:
0
4 [报告]
发表于 2008-12-24 17:30 |只看该作者
1111 [16.98500]
2222 [16.99000]

我这结果没问题啊

论坛徽章:
0
5 [报告]
发表于 2008-12-24 17:40 |只看该作者
原帖由 5毛党党员 于 2008-12-24 17:30 发表
1111 [16.98500]
2222 [16.99000]

我这结果没问题啊


请问你的开发环境??
我是在AIX上

论坛徽章:
0
6 [报告]
发表于 2008-12-24 23:42 |只看该作者

回复 #5 guaiguaixo 的帖子

又是平台相关

论坛徽章:
0
7 [报告]
发表于 2008-12-25 09:30 |只看该作者
lz可以在man一下 floor,看看是不是有什么特殊的解释

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2008-12-25 09:40 |只看该作者
浮点数本身是不精确的,16.985 + 0.005的实际结果可能小于 16.990。
要想得到16.990,加的0.005要多一位,如0.0051。
不过还要考虑不要超过了浮点数的有效位数

论坛徽章:
0
9 [报告]
发表于 2009-01-04 15:46 |只看该作者
原帖由 hellioncu 于 2008-12-25 09:40 发表
浮点数本身是不精确的,16.985 + 0.005的实际结果可能小于 16.990。
要想得到16.990,加的0.005要多一位,如0.0051。
不过还要考虑不要超过了浮点数的有效位数


你说的这个可能我也考虑过,但我用16.885+0.005计算的结果就对,为什么只有16.985是错的.

论坛徽章:
0
10 [报告]
发表于 2009-01-04 20:54 |只看该作者
原帖由 hellioncu 于 2008-12-25 09:40 发表
浮点数本身是不精确的,16.985 + 0.005的实际结果可能小于 16.990。
要想得到16.990,加的0.005要多一位,如0.0051。
不过还要考虑不要超过了浮点数的有效位数


嗯,我也认为应该是浮点数的精度问题造成的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP