打印

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

[复制链接]
12661|88
手机看帖
扫描二维码
随时随地手机跟帖
沙发
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



呵呵,说说那里不行?!

使用特权

评论回复
5
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。

使用特权

评论回复
6
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的时候又放弃了小数位,你要能计算正确估计真是见鬼了。。。

使用特权

评论回复
7
ZALIN| | 2010-10-8 15:28 | 只看该作者
result=60-(x*20+y-1)/(2*y)

使用特权

评论回复
8
yewuyi| | 2010-10-8 15:38 | 只看该作者
本帖最后由 yewuyi 于 2010-10-8 15:40 编辑

LS方法也很好,可以避免减法造成的反向进位

使用特权

评论回复
9
fushaobing|  楼主 | 2010-10-8 16:09 | 只看该作者
to yewuyi:
我只是想告诉你,当x=23,y=9时,正确答案是34。
但是按你提供的方法,得到的结果却是35。

使用特权

评论回复
10
zjucsd| | 2010-10-8 16:21 | 只看该作者
计算23*100/9的时候,会出现一个小数部分被忽略的问题。可以按照yewuyi的想法,只不过将*10改为*100再加上50之后,除以100就可以了。
result=6000-x*1000/y;
result=(result+50)/100;

使用特权

评论回复
11
jack_shine| | 2010-10-8 16:25 | 只看该作者
7# ZALIN
7楼何解,怎么和lz给的等式不等?求解释

使用特权

评论回复
12
yewuyi| | 2010-10-8 17:24 | 只看该作者
to yewuyi:
我只是想告诉你,当x=23,y=9时,正确答案是34。
但是按你提供的方法,得到的结果却是35。
fushaobing 发表于 2010-10-8 16:09


LZ脑子犯晕了,我都说那么清楚了,难道你还没看懂?!

使用特权

评论回复
13
fushaobing|  楼主 | 2010-10-8 17:30 | 只看该作者
to 11楼:
那是一种四舍五入的方法。
x*10/y+1/2=(x*20+y)/2y.
7楼多减了一个1,“yewuyi”说是可以避免减法造成的反向进位。我不知道7楼的答案是不是百分百正确,正在验算中。

使用特权

评论回复
14
batsong| | 2010-10-8 17:33 | 只看该作者
运算时是float,算完加个0.5赋值给整型就可以四舍五入

使用特权

评论回复
15
123jj| | 2010-10-8 17:34 | 只看该作者
呵呵!

好贴要顶!

使用特权

评论回复
16
fushaobing|  楼主 | 2010-10-8 17:40 | 只看该作者
to 10楼:
你说的方法跟yewuyi一样,在某些情况下会得出不准确的结果。

to 14楼:
忘了说个前提,不可以使用浮点数。

使用特权

评论回复
17
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楼的方法很简单,但不知道是不是百分百准确,我还在验算。

使用特权

评论回复
18
fushaobing|  楼主 | 2010-10-8 17:58 | 只看该作者
to yewuyi:
谢谢你关注这个帖子。
我发这个帖子是想和大家讨论技术问题。请不要再用“见鬼了”,“LZ脑子犯晕了”这样的字眼。
尊重别人即是尊重自己。

使用特权

评论回复
19
lixitong| | 2010-10-8 20:28 | 只看该作者
二楼的做法是正确的

使用特权

评论回复
20
wangyy608| | 2010-10-8 20:42 | 只看该作者
60-23*10/9=34.44444444444444?
=35

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

106

帖子

1

粉丝