四舍五入VS银行家舍入法
2015-09-30 10:32
113 查看
在学习python的时候,遇见了一个颠覆了我传统观念的四舍五入。
看下面,round()的结果和我们以前根深蒂固的四舍五入是不同的。
经过一系列的搜索才明白这是为什么。
其实在 VB, VBScript, C#, J#, T-SQL 中 Round 函数都是采用 Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。并且这种银行家舍入算法比四舍五入算法更加精确。
它规则是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一(百度百科这样总结的)。
看上图,基于round函数要更精确的取整,那么就产生了要舍位或者进位的问题。究竟是进位还是舍位,那还是得看概率的。P(小于0.5)=P(大于0.5)。这两种情况概率相等的结果就是,小于0.5理应舍位取整,大于0.5则进位取整。那么问题来了,万一某位数的小数点位为0.5呢?那到底向前进位还是向后舍位呢?为了更精确起见,python等一些语言的Round 函数则采用 Banker's rounding(银行家舍入)算法,为0.5的时候进位舍位看小数点前个位是奇数还是偶数,是奇进位,是偶舍位。这也是银行家舍入算法的思想。
看下面,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 标准的语言都应该是采用这一算法的。并且这种银行家舍入算法比四舍五入算法更加精确。
它规则是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一(百度百科这样总结的)。
看上图,基于round函数要更精确的取整,那么就产生了要舍位或者进位的问题。究竟是进位还是舍位,那还是得看概率的。P(小于0.5)=P(大于0.5)。这两种情况概率相等的结果就是,小于0.5理应舍位取整,大于0.5则进位取整。那么问题来了,万一某位数的小数点位为0.5呢?那到底向前进位还是向后舍位呢?为了更精确起见,python等一些语言的Round 函数则采用 Banker's rounding(银行家舍入)算法,为0.5的时候进位舍位看小数点前个位是奇数还是偶数,是奇进位,是偶舍位。这也是银行家舍入算法的思想。
相关文章推荐
- java中的一些组件
- 如果使用得当,MySQL 也可以化身 NoSQL
- ocp-v13-064
- 名人演讲并没有实际意义、跟名人传一样
- C++中的字节对齐
- 设计模式-开发中的23种设计模式详解
- 赢商网 > 赢商新闻 > 社区商业
- iOS开发中@property的属性weak nonatomic strong readonly等介绍
- StringBuffer 方法
- js技巧笔记(不断更新)
- 【手把手教你全文检索】Apache Lucene初探
- SQL字符串转换为数组
- DOS删除空格
- 万科北京区域V-learn发布 系V-LINK产品系中首批产品
- 在Eclipse中Attach Source
- FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具
- 判断奇偶数2
- Visual Studio 2013如何破解(密钥激活)
- C# Cache的类方法
- 转载 C++中友元详解