四舍五入VS银行家舍入法

  在学习python的时候,遇见了一个颠覆了我传统观念的四舍五入。

  看下面,round()的结果和我们以前根深蒂固的四舍五入是不同的。

>>> round(0.5)
0
>>> round(1.5)
2
>>> round(1.4)
1
>>> round(1.6)
2
>>> round(2.4)
2
>>> round(2.5)
2
>>> round(2.6)
3
>>> 

  经过一系列的搜索才明白这是为什么。

  其实在 VB, VBScript, C#, J#, T-SQL 中 Round 函数都是采用 Banker’s rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。并且这种银行家舍入算法比四舍五入算法更加精确。

  它规则是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一(百度百科这样总结的)。

  《四舍五入VS银行家舍入法》

  看上图,基于round函数要更精确的取整,那么就产生了要舍位或者进位的问题。究竟是进位还是舍位,那还是得看概率的。P(小于0.5)=P(大于0.5)。这两种情况概率相等的结果就是,小于0.5理应舍位取整,大于0.5则进位取整。那么问题来了,万一某位数的小数点位为0.5呢?那到底向前进位还是向后舍位呢?为了更精确起见,python等一些语言的Round 函数则采用 Banker’s rounding(银行家舍入)算法,为0.5的时候进位舍位看小数点前个位是奇数还是偶数,是奇进位,是偶舍位。这也是银行家舍入算法的思想。

    原文作者:mapme
    原文地址: https://www.cnblogs.com/mapc/p/4848476.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞