【Python】(注意)Round関数は四捨五入ではない!Decimalを使おう

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メソッドを使ってください。

タイトルとURLをコピーしました