打印

请教一个C语言中4舍5入的算法

[复制链接]
3078|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz_boy|  楼主 | 2010-10-29 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz_boy 于 2010-10-29 12:59 编辑

请教一个4舍5入的算法,比如有一个值是4997,最后个位上要4舍5入,怎么得到5000?如果是有小数点的又该怎么算?比如499.7怎么得到500?

实际情况是这样的,设计中有个比较值(int)c=3110,对应的显示值是(int)b=500,实际采样得到的值是(int)a=3108,要求出的对应的显示值(int)d我是这么算的:d=(long)a*b/(long)c;得到的是499,小数点被省略了。

本人C语言学的不怎么好,请大虾们耐心讲解,我也好学学,谢谢了!

相关帖子

沙发
程序匠人| | 2010-10-29 10:57 | 只看该作者
提醒一下:十进制中的“0.5” = 二进制中的“0.1”
所以,十进制中的“四舍五入” = 二进制中的“零舍一入”

思路:
1、求商 d=(long)a*b/(long)c   (这一步就是你原来做的)
2、求余数 e = (long)a*b%(long)c
3、判断:如果d>2e,则不进位 ;如果d<=2e,则进位(d++)
4、结果为d

使用特权

评论回复
板凳
xyz_boy|  楼主 | 2010-10-29 12:55 | 只看该作者
本帖最后由 xyz_boy 于 2010-10-29 12:59 编辑

谢谢匠人提醒,但第三步没看懂,为什么商要和两倍的余数比较?
想了个笨办法:
将(int)b改成5000,那最后d=4997,再加一步运算:
(d+5)/10*10;
最后d=5000

上面实际情况里有点说错了,a和c反了,修改了。

使用特权

评论回复
地板
程序匠人| | 2010-10-29 13:49 | 只看该作者
针对我上午的方法,再改进一下:


d=(a*b+c/2)/c  (直接取代你原来的公式即可)

推导:d=(a*b+c/2)/c = a*b/c +0.5

使用特权

评论回复
5
程序匠人| | 2010-10-29 13:50 | 只看该作者
"但第三步没看懂,为什么商要和两倍的余数比较?"

因为0.5的两倍=1。正好符合四舍五入

使用特权

评论回复
6
程序匠人| | 2010-10-29 13:56 | 只看该作者
“想了个笨办法:
将(int)b改成5000,那最后d=4997,再加一步运算:
(d+5)/10*10;
最后d=5000


——这个方法也可行。不过,为何不更简单些呢。你是直接把b放大10倍,而实际上只需要放大2倍即可,如下:
将(int)b改成1000,那最后d=2499,再加一步运算:
(d+5)/2*10;
最后d=5000

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
happde + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

31

帖子

1

粉丝