四舍五入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的時候進位舍位看小數點前個位是奇數還是偶數,是奇進位,是偶舍位。這也是銀行家舍入算法的思想。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM