在學習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 標准的語言都應該是采用這一算法的。並且這種銀行家舍入算法比四舍五入算法更加精確。
它規則是:四舍六入五考慮,五后非零就進一,五后為零看奇偶,五前為偶應舍去,五前為奇要進一(百度百科這樣總結的)。
看上圖,基於round函數要更精確的取整,那么就產生了要舍位或者進位的問題。究竟是進位還是舍位,那還是得看概率的。P(小於0.5)=P(大於0.5)。這兩種情況概率相等的結果就是,小於0.5理應舍位取整,大於0.5則進位取整。那么問題來了,萬一某位數的小數點位為0.5呢?那到底向前進位還是向后舍位呢?為了更精確起見,python等一些語言的Round 函數則采用 Banker's rounding(銀行家舍入)算法,為0.5的時候進位舍位看小數點前個位是奇數還是偶數,是奇進位,是偶舍位。這也是銀行家舍入算法的思想。