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

[复制链接]
3587|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
程序匠人 发表于 2010-10-29 13:50 | 显示全部楼层
"但第三步没看懂,为什么商要和两倍的余数比较?"

因为0.5的两倍=1。正好符合四舍五入
程序匠人 发表于 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

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