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