查看: 1385|回复: 7
|
Programming C 里,如何把float的小数点位变少?(How to round up decimal places?)
[复制链接]
|
|
我们知道如果要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 ?
救命啊~~~~~~~~~~ |
|
|
|
|
|
|
|
发表于 21-1-2008 11:44 PM
|
显示全部楼层
很難完美的。
那是你的精細度不夠,把float 換成 double。
如果還是不夠精細,就用 long double 吧!
(我用的是VC++,C裏邊不曉得有嗎? )
但始終還是有不完美的,
因爲電腦的資料與指令是用數碼(Digital)而不是類比(Analog)代表的。 |
|
|
|
|
|
|
|

楼主 |
发表于 21-1-2008 11:52 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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兄的答案不错,谢谢你  |
|
|
|
|
|
|
|
发表于 23-1-2008 01:12 AM
|
显示全部楼层
|
|
|
|
|
|
|

楼主 |
发表于 24-1-2008 12:21 AM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|