HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

四舍六入

Posted on 2011-09-19 14:14  光铭  阅读(409)  评论(0)    收藏  举报

这种方法小学的时候就学过,它虽然简单,但是产生误差累计的因素还是很明显的。
就拿保留整数来说:
小数部分从0.0~0.4999,是属于“舍”的范围,产生的误差就是0.0~0.4999;
而小数部分0.5~0.9999,是属于“入”的范围,产生的误差就是0.5~0.0001。
在此就可以看出,两者的误差是不均等的,“入”的误差稍大。
因此,一个运算式子,如果其中经过了多次的四舍五入,产生的误差一般来说是难以互相抵消的。

四舍六入五成双
其实,就一位小数来说,舍去 0.0 是不存在误差的;只有 0.1~0.4、0.5、0.6~0.9 这 9 个数字舍入存在误差的问题。
那么就可以把“0.1~0.4”这 4 个数字舍去,把“0.6~0.9”这 4 个数字入上,由此产生误差的概率将是相同的,在大量计算时可以抵消误差。
而对于0.5,无论是是舍,还是入,都会有出现最大的舍入误差。
从概率上说,这个 0.5,应该有 50% 的概率是舍去,有 50% 的概率是入,以争取在大量计算时误差互相抵消。
这个就可以看 0.5 前面的位了,如果是奇数,就入上,如果是偶数,就舍去这个 0.5。

例如:把下列数字,保留两位小数。
1.265,末尾的 5,要根据前面的 6,舍,结果是:1.26;
1.275,末尾的 5,要根据前面的 7,入,结果是:1.28;
1.285,末尾的 5,要根据前面的 8,舍,结果是:1.28;
1.295,末尾的 5,要根据前面的 9,入,结果是:1.30。

这就是“银行家舍入算法(Banker's rounding)”,可以说成:四舍六入五成双。