[python] 四捨五入的陷阱

點閱: 398

python 的四捨五入陷阱

round() 函數可以進行四捨五入,但是常常有不如預期的結果發生。如下範例:

file

為什麼 python3 的 round(0.5) = 0 不符預期而 round(1.5) = 2 卻符合預期呢?這是因為 python 在進行 rounding 的時候,會把值逼近最近的偶數值 。我們看看官方文件的描述

For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2). Any integer value is valid for ndigits (positive, zero, or negative). The return value is an integer if ndigits is omitted or None. Otherwise the return value has the same type as number.

這就是為什麼大家習慣稱呼 python 的四捨五入實際上為: 四捨六入五成雙 的原因。

正確進行四捨五入的方式

搜尋了一下,發現建議用 decimal 套件的 quantize() 進行操作,官方文件在這。

  • quantize(exp, rounding=None, context=None)
    • exp: 期望要被 round 的物件的型態
    • rounding: 要進位的方法,預設為 None
      • rounding models 可接受的參數為: ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN… 等
    • context: 環境變數(小數位數、進位方法等),預設為 None

範例

使用 ROUND_HALF_UP 即可進行四捨五入了

file

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts