打印

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

[复制链接]
楼主: fushaobing
手机看帖
扫描二维码
随时随地手机跟帖
61
be1st| | 2010-10-10 14:04 | 只看该作者 回帖奖励 |倒序浏览
ZALIN的算法,应该是对整数除法运算中取整误差的一种修正方法,用修正一个 (y-1)/2*y  (小于0.5的一个最大值)的小数部分,使舍去的小数部分大于等于0.5的自动进位为1。
不知道自己的想法是不是正确的?

使用特权

评论回复
62
yewuyi| | 2010-10-10 16:50 | 只看该作者
你简直就是一个SB...


滚你妈蛋..

使用特权

评论回复
63
huangqi412| | 2010-10-10 18:43 | 只看该作者
:funk:

使用特权

评论回复
64
fushaobing|  楼主 | 2010-10-11 13:18 | 只看该作者
to ZALIN:
你的公式是准确的!
我已经用穷举的方法试过了,我需要的约两万组数据全部能得出准确结果。
谢谢你!

使用特权

评论回复
65
fushaobing|  楼主 | 2010-10-11 13:23 | 只看该作者
to ZALIN:
你的公式是正确的!
我已经用穷举的方法试过了。我需要的约两万种情况全部能得出正确结果。
谢谢你!

使用特权

评论回复
66
fushaobing|  楼主 | 2010-10-11 13:44 | 只看该作者
你简直就是一个SB...


滚你妈蛋..
yewuyi 发表于 2010-10-10 16:50


急火攻心了?
此时此刻,你做人的水准和做事的水准我已经知道了。

本来,热爱技术的人在一起讨论技术问题是一件很开心的事。懂与不懂,错与对又有什么关系?大家讨论分析一下,总会明白的。何必三番两次出言不逊,现在连脏话都骂出来了?

虽然是在网络上,但人与人之间的尊重跟在现实生活中没有区别。

使用特权

评论回复
67
yewuyi| | 2010-10-11 15:39 | 只看该作者
急火攻心了?
此时此刻,你做人的水准和做事的水准我已经知道了。

本来,热爱技术的人在一起讨论技术问题是一件很开心的事。懂与不懂,错与对又有什么关系?大家讨论分析一下,总会明白的。何必三番两次出言不逊 ...
fushaobing 发表于 2010-10-11 13:44


是你这SB先骂老子的。

只要不是SB都应该知道‘见鬼了’,‘犯晕了’基本是一些中性词语。

使用特权

评论回复
68
yewuyi| | 2010-10-11 15:42 | 只看该作者
像你这么嚣张的俺见多了,别以为俺不会开口骂人。。。

使用特权

评论回复
69
yewuyi| | 2010-10-11 15:47 | 只看该作者
俺好心给你回答问题,你TMD不感谢半句,反而攻击老子,你以为俺欺负是吧。。。


你5楼的计算本来是就矛盾的,我在随后的帖子中已经分析的清清楚楚,你自己没本事把问题描述清楚,关别人屁事情。

使用特权

评论回复
70
fushaobing|  楼主 | 2010-10-11 22:32 | 只看该作者
总结(结贴)

题目:求“result=60-x*10/y”的值,要求四舍五入。所有变量都为长整型。(不可以使用浮点运算)


7楼给出的答案“result=60-(x*20+y-1)/(2*y)”能得到百分百正确的结果,而且非常简洁。
谢谢“ZALIN”!

我自己的做法如下。


                if ( (((x*100)%y)==0) && ((((x*100)/y)%10)==5) )
                {
                         x=x*10/y;
                }
                else
                {
                         x=x*100/y;
                        x=(x+5)/10;                        
                }

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

虽然可行,但过于繁琐。

谢谢所有关注或回复此贴的人!谢谢你们的意见!

此贴对任何人引起的任何不快,我在这里表示歉意。那并不是我想看到的。

2010-10-11

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
不亦心 + 1
71
1024| | 2010-10-13 11:45 | 只看该作者
路过,学习了。

使用特权

评论回复
72
雨下枫| | 2010-10-13 17:10 | 只看该作者
我完整的看了所有的评论,其实是LZ和2楼对问题的理解有偏差,原因32楼已经说了
这里对2楼的算法做一下改进就行了,如下:
result =( (600*y-x*100)/y + 5)/10
应该说两位高手说的都没错!
再强调一下2楼的算法对解四舍五入没有问题

使用特权

评论回复
73
focuson| | 2010-10-13 18:46 | 只看该作者
本帖最后由 focuson 于 2010-10-13 18:50 编辑

70楼是错误的

使用特权

评论回复
74
fushaobing|  楼主 | 2010-10-13 22:02 | 只看该作者
to 72楼:
谢谢你的耐心和指教!
我验算了你的公式,全部能得出正确结果。可否请教一下你的思路?为什么你那样一改,就ok了?

另外,当客户将公式“result=60-x*10/y”(要求四舍五入)提供给我之后,他将怎样验收我的软件呢?他不外乎就是通过Windows系统附件里面的“计算器”,或者用Excel制作一个表格来验算。客户不管计算过程,只要正确结果。
因此,对于本贴的问题,2楼的算法达不到要求(大部分正确,小部分不正确)。我这样说,不知道您是否认同?

使用特权

评论回复
75
fushaobing|  楼主 | 2010-10-13 22:23 | 只看该作者
to 72楼:
补充一点。
你说“再强调一下2楼的算法对解四舍五入没有问题”,我有不同的意见。我的看法是,如果“x*10/y”前面是一个加号,那么2楼的算法完全正确。如果“x*10/y”前面是一个减号(即为负数),则不可以这样处理。
你怎么看?想听听您的意见。

使用特权

评论回复
76
aihe| | 2010-10-13 23:06 | 只看该作者
本帖最后由 aihe 于 2010-10-13 23:08 编辑

哈哈,有趣
我验算了一下
基本正确

使用特权

评论回复
77
雨下枫| | 2010-10-14 09:59 | 只看该作者
2楼的做法是对(10*x/y)这个项做了四舍五入,而我的做法是对(60-10*x/y)做四舍五入,这就是根本的区别。所以我说2楼关于四舍五入的算法是没错的。
另外这所以会有10*x/y前面是+运算可以,对-运算就不成立,是因为C语言对整形数的运算规则里小数点后面都是舍去的。所以(10*x/y)这项整形计算值<用浮点型运算值
另外我对7楼的算法也很感兴趣,试图去证明它的正确性,(y-1/2y)<0.5,最接近0.5的有效表达值这是成立的。
共同研究,呵呵。也请原创作者证明一下,好比说用数学归纳法。穷举不是个科学的验证方法

使用特权

评论回复
78
雨下枫| | 2010-10-14 10:07 | 只看该作者
楼主你可以把问题看成是(60-(xx.000(纯整数)+0.xxx(纯小数)))这样你就明白为什么前面是+就行是-就有可能出错

使用特权

评论回复
79
ZALIN| | 2010-10-14 14:44 | 只看该作者
to 77楼:
关于(y-1)/2y<0.5并且最接近0.5,因为y/2y=0.5,而y-1是小于y的最大整数,显而易见可以得出前述结论

你在72楼的算式是把LZ的算式转换成了一个‘正’表达式,所以可以适用+0.5再取整的方法,
不过可以简化成:result =(60*y-x*10+y/2)/y,60*y>=x*10

我们可以归纳出普遍的整数运算的四舍五入的方法:
形如:result=a+b/c,四舍五入可以表示为:result=a+(b+c/2)/c
形如:result=a-b/c,四舍五入可以表示为:result=a-(2b+c-1)/2c 或result=a-(b+(c-1)/2)/c
上述算式中的除法是整数运算,也就是取整数,丢弃余数。

如果一个算式中有多于一个的除法表达式,可以合并成一个除法表达式后再使用上述方法

使用特权

评论回复
80
fushaobing|  楼主 | 2010-10-14 14:55 | 只看该作者
to 雨下枫:
谢谢你的解释!
感觉很不可思议!我为什么就想不到呢?哈哈。
7楼后来也给出了推导过程,麻烦你自己找一下。

另外,我觉得对(10*x/y)这个项做四舍五入应该这样写:result=60-(x*20+y)/(2*y).
这与2楼的“result =( 600-x*100/y + 5)/10”还是有很大区别的。我刚才验算了约两万组数据,前者产生18个错误,后者产生457个错误。

使用特权

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

本版积分规则