Pythonのround関数は四捨五入じゃない!decimal.quantizeで小数・整数を丸める方法

Pythonのround関数は偶数丸め(銀行丸め)という端数処理です。四捨五入されるとは限らないので注意が必要です。例えばround(2.5)は、2になります。小数・整数を正しく四捨五入するには、decimalモジュールのDecimal.quantize関数を使います。

四捨五入じゃないってどういうこと?

Pythonのround()の結果が四捨五入ではないことは、下の例を見れば分かります。


round(2.5)
# 2

round(0.25, 1)
# 0.2

いずれも「五入」されていないことが分かります。理由は、round関数は「偶数丸め」という端数処理だからです。偶数丸めとは、5の処理を偶数側に入れる形で処理することです。つまり、pythonのround関数の端数処理は五捨五入もあり得るのです。

正しく四捨五入するにはDecimal.quantize

Pythonの標準ライブラリのdecimalモジュールからDecimalクラスを使えば、四捨五入できます。関数roundexを作ってみました。

from decimal import Decimal, ROUND_HALF_UP

def roundex(number, digit=0):
    return float(Decimal(
        str(number)).quantize(
        Decimal(str(10**-digit)),
        rounding=ROUND_HALF_UP))


##関数を使ってみると...
roundex(2.5)
# 3.0
Python
あんちょこ
タイトルとURLをコピーしました