四舍五入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 标准的语言都应该是采用这一算法的。并且这种银行家舍入算法比四舍五入算法更加精确。

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

  image

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

转载于:https://www.cnblogs.com/mapc/p/4848476.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值