一个四舍五入的问题,大家帮忙看看

[复制链接]
 楼主| fushaobing 发表于 2010-10-8 12:30 | 显示全部楼层 |阅读模式
求“result=60-x*10/y”的值,x,y是变量。要求四舍五入。
请大家帮忙看看。
yewuyi 发表于 2010-10-8 13:12 | 显示全部楼层
result=60-x*10/y

改成:
result=600-x*100/y;
result=(result+5)/10;

如此之后,得到的result即为4舍5入的结果。
ZLSWRH 发表于 2010-10-8 13:19 | 显示全部楼层
2楼好象不行!
yewuyi 发表于 2010-10-8 13:24 | 显示全部楼层
2楼好象不行!
ZLSWRH 发表于 2010-10-8 13:19



呵呵,说说那里不行?!
 楼主| fushaobing 发表于 2010-10-8 14:49 | 显示全部楼层
2楼的确不行。
比如x=23,y=9.
60-23*10/9=34.44444444444444,四舍五入后的结果是34.
按照2楼的做法,600-23*100/9=600-255=345, 然后(345+5)/10=35。
yewuyi 发表于 2010-10-8 15:23 | 显示全部楼层
2楼的确不行。
比如x=23,y=9.
60-23*10/9=34.44444444444444,四舍五入后的结果是34.
按照2楼的做法,600-23*100/9=600-255=345, 然后(345+5)/10=35。
fushaobing 发表于 2010-10-8 14:49


自己好好想想你计算的对不对呢!?

你计算23*10/9的时候带小数位,做23*100/9的时候又放弃了小数位,你要能计算正确估计真是见鬼了。。。
ZALIN 发表于 2010-10-8 15:28 | 显示全部楼层
result=60-(x*20+y-1)/(2*y)
yewuyi 发表于 2010-10-8 15:38 | 显示全部楼层
本帖最后由 yewuyi 于 2010-10-8 15:40 编辑

LS方法也很好,可以避免减法造成的反向进位
 楼主| fushaobing 发表于 2010-10-8 16:09 | 显示全部楼层
to yewuyi:
我只是想告诉你,当x=23,y=9时,正确答案是34。
但是按你提供的方法,得到的结果却是35。
zjucsd 发表于 2010-10-8 16:21 | 显示全部楼层
计算23*100/9的时候,会出现一个小数部分被忽略的问题。可以按照yewuyi的想法,只不过将*10改为*100再加上50之后,除以100就可以了。
result=6000-x*1000/y;
result=(result+50)/100;
jack_shine 发表于 2010-10-8 16:25 | 显示全部楼层
7# ZALIN
7楼何解,怎么和lz给的等式不等?求解释
yewuyi 发表于 2010-10-8 17:24 | 显示全部楼层
to yewuyi:
我只是想告诉你,当x=23,y=9时,正确答案是34。
但是按你提供的方法,得到的结果却是35。
fushaobing 发表于 2010-10-8 16:09


LZ脑子犯晕了,我都说那么清楚了,难道你还没看懂?!
 楼主| fushaobing 发表于 2010-10-8 17:30 | 显示全部楼层
to 11楼:
那是一种四舍五入的方法。
x*10/y+1/2=(x*20+y)/2y.
7楼多减了一个1,“yewuyi”说是可以避免减法造成的反向进位。我不知道7楼的答案是不是百分百正确,正在验算中。
batsong 发表于 2010-10-8 17:33 | 显示全部楼层
运算时是float,算完加个0.5赋值给整型就可以四舍五入
123jj 发表于 2010-10-8 17:34 | 显示全部楼层
呵呵!

好贴要顶!
 楼主| fushaobing 发表于 2010-10-8 17:40 | 显示全部楼层
to 10楼:
你说的方法跟yewuyi一样,在某些情况下会得出不准确的结果。

to 14楼:
忘了说个前提,不可以使用浮点数。
 楼主| fushaobing 发表于 2010-10-8 17:46 | 显示全部楼层
我是这样做的。

                if ( (((x*100)%y)==0) && ((((x*100)/y)%10)==5) )
                {
                        //do not round
                        x=x*10/y;
                }
                else
                {
                        // When rounded: <0.5, =0; >=0.5, =1;
                        x=x*100/y;
                        x=(x+10/2)/10;                       
                }

if (x<60) result=60-x;
...

//===================================================

我想问问大家有没有更简洁的方法。
7楼的方法很简单,但不知道是不是百分百准确,我还在验算。
 楼主| fushaobing 发表于 2010-10-8 17:58 | 显示全部楼层
to yewuyi:
谢谢你关注这个帖子。
我发这个帖子是想和大家讨论技术问题。请不要再用“见鬼了”,“LZ脑子犯晕了”这样的字眼。
尊重别人即是尊重自己。
lixitong 发表于 2010-10-8 20:28 | 显示全部楼层
二楼的做法是正确的
wangyy608 发表于 2010-10-8 20:42 | 显示全部楼层
60-23*10/9=34.44444444444444?
=35
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

106

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部