佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1385|回复: 7

Programming C 里,如何把float的小数点位变少?(How to round up decimal places?)

[复制链接]
发表于 21-1-2008 07:32 PM | 显示全部楼层 |阅读模式
我们知道如果要display float,可以用好像'%.3f'之类的来把小数点定在三位。问题是如果我要我的program里面全部float在计算时都只用要三个小数点,要怎么做?换句话说,如何把小数点定在三位for all my computation of the floats in my program?

很讨厌每次都得到0.4000001 或 0.8499999 的答案, 我明明要的是0.4和0.85 罢了。有时更离谱:
0.5+(1 - 0.5)* 0.4000001(我要的只是0.4,算出来却是0.4000001) = 0.6999999   。为什么会这样?而且答案都不是0.7000005, 而是0.6999999更糟! why ?

救命啊~~~~~~~~~~
回复

使用道具 举报


ADVERTISEMENT

发表于 21-1-2008 11:44 PM | 显示全部楼层
很難完美的。
那是你的精細度不夠,把float 換成 double。
如果還是不夠精細,就用 long double 吧!
(我用的是VC++,C裏邊不曉得有嗎?
但始終還是有不完美的,
因爲電腦的資料與指令是用數碼(Digital)而不是類比(Analog)代表的。
回复

使用道具 举报

 楼主| 发表于 21-1-2008 11:52 PM | 显示全部楼层
应该有办法gua ?
回复

使用道具 举报

发表于 22-1-2008 03:20 AM | 显示全部楼层
如果运算数目不大,可将所有数值乘以1000,再以32-bit 或 64-bit integer 储存,display时再除以1000就行了。
        float fx=3.101023;
        float fy=4.202044;
        int x=(int) (fx*1000);
        int y=(int) (fy*1000);
        printf("result = %f",(float)(x+y)/1000);


如果非得用float or double 不可,可考虑用math.h 里的floor/ceil/rint/round等 function.
        float fx=3.101023;
        float fy=4.202044;
        printf("result = %f",(floor(fx*1000)+floor(fy*1000))/1000);


[ 本帖最后由 bontakun 于 22-1-2008 09:29 AM 编辑 ]
回复

使用道具 举报

发表于 22-1-2008 09:09 AM | 显示全部楼层
原帖由 bontakun 于 22-1-2008 03:20 AM 发表
如果运算数目不大,可将所有数值乘以1000,再以32-bit 或 64-bit integer 储存,display时再除以1000就行了。
        float fx=3.101023;
        float fy=4.202044;
        int x=(int) (fx*1000);
        i ...


我觉得 那么做 挺浪费处理器的资源,由其是 除法。。。
我觉得, internally 系统怎么 store 可以不管, 主要是你display 时, display你要的format 就好了。
回复

使用道具 举报

 楼主| 发表于 22-1-2008 12:23 PM | 显示全部楼层
谢谢大家的回答,抓到一点concept了。bontakun兄的答案不错,谢谢你
回复

使用道具 举报

Follow Us
发表于 23-1-2008 01:12 AM | 显示全部楼层
为什么不换去C++呢?
回复

使用道具 举报

 楼主| 发表于 24-1-2008 12:21 AM | 显示全部楼层
换了又怎样?????
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-9-2025 05:44 AM , Processed in 0.114644 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表