Pythonで四捨五入する時にRound関数を使っていませんか?
PythonのRound関数は四捨五入ではありません。
端数が「5」の場合、偶数へ丸められてしまいますので注意が必要です。
PythonのRound関数は四捨五入ではない
Round関数の仕様は以下のようになっています。
- 端数が5より小さいなら切り捨て
- 端数が5より大きいなら切り上げ
- 端数がちょうど5なら切り捨てと切り上げのうち結果が偶数となる方へ丸められる
つまり以下の結果になります。
>>> round(2951164.1) # 端数が5より小さい
2951164
>>> round(2951164.9) # 端数が5より大きい
2951165
>>> round(2951164.5) # 端数がちょうど5
2951164
ご覧の通り端数がちょうど5の場合、
四捨五入だと「2951164.5」が「2951165」になるはずですが、
「2951164」になっていることが確認できます。
その旨はPythonの公式サイトにも記載されています。
round() をサポートする組み込み型では、値は 10 のマイナス ndigits 乗の倍数の中で最も近いものに丸められます; 二つの倍数が同じだけ近いなら、偶数を選ぶ方に丸められます。
Python公式サイトより引用
Pythonで四捨五入する方法
Pythonで四捨五入する場合、Decimalクラスのquantizeメソッドを使ってください。
https://docs.python.org/ja/3/library/decimal.html
具体的な使い方は以下になります。
>>> from decimal import Decimal, ROUND_HALF_UP
>>> print(Decimal(str(2951164.1)).quantize(Decimal('1.'), rounding=ROUND_HALF_UP))
2951164
>>> print(Decimal(str(2951164.9)).quantize(Decimal('1.'), rounding=ROUND_HALF_UP))
2951165
>>> print(Decimal(str(2951164.5)).quantize(Decimal('1.'), rounding=ROUND_HALF_UP))
2951165
今度は「2951164.5」が「2951165」に正しく四捨五入されていることが確認できます。
まとめ
Round関数では四捨五入できません。
Pythonで四捨五入したい時はDecimalクラスのquantizeメソッドを使ってください。