本記事ではPythonで四捨五入する方法を解説します。組み込み関数のroundを利用すると簡単に四捨五入ができるため、roundの使い方を説明します。
round
組み込み関数roundは、数値を指定した桁数で四捨五入するための関数です。
基本的な書式は以下の通りです。
round(number, ndigits=None)
- number: 四捨五入したい数値
- ndigits: 小数点以下の桁数(省略すると整数に四捨五入)
この関数は引数に指定した数値を、指定した小数点以下の桁数に四捨五入して返します。第2引数を省略すると、最も近い整数に四捨五入します。
例
以下にround関数の使用例をいくつか示します。
# 整数への四捨五入
print(round(3.14)) # 出力: 3
print(round(3.5)) # 出力: 4
print(round(3.6)) # 出力: 4
print(round(-3.5)) # 出力: -4
# 小数点以下の桁数を指定した四捨五入
print(round(3.14159, 2)) # 出力: 3.14
print(round(3.14559, 2)) # 出力: 3.15
print(round(3.1455, 3)) # 出力: 3.146
小数点以下の桁数に負の値を指定すると、小数点より左の桁(整数部分)を四捨五入することもできます。
print(round(1234, -1)) # 出力: 1230(10の位で四捨五入)
print(round(1254, -1)) # 出力: 1250
print(round(1256, -2)) # 出力: 1300(100の位で四捨五入)
注意点
Pythonのround関数には、いくつか注意すべき点があります。
偶数への丸め(Banker’s Rounding)
Pythonのround関数は、丁度中間の値(例:2.5)の場合、最も近い偶数に丸めるという「偶数への丸め」というルールを採用しています。これは統計的なバイアスを減らすために使われる方法ですが、一般的な四捨五入のルール(5以上を切り上げ)とは異なります
print(round(2.5)) # 出力: 2(偶数への丸め)
print(round(3.5)) # 出力: 4(偶数への丸め)
print(round(4.5)) # 出力: 4(偶数への丸め)
print(round(5.5)) # 出力: 6(偶数への丸め)
浮動小数点数の精度の問題
浮動小数点数の二進表現の特性により、十進数で正確に表現できない値があります。このため、round関数を使用した結果が直感的でない場合があります。
print(2.675) # 実際には 2.675 ではなく、わずかに異なる値として格納される
print(round(2.675, 2)) # 期待値: 2.68 ですが、実際は 2.67 になることがある
# より詳細に見てみると
print(format(2.675, '.20f')) # 2.67499999999999982236
この問題は、浮動小数点数が内部で二進数として表現されるために発生します。2.675のような十進数は二進数で正確に表現できないため、わずかな誤差が生じます。
小数点以下が0桁の場合は整数型になる
ndigitsが0または省略された場合、結果は整数型(int)になります。これは、Python 3での仕様です。
print(type(round(3.14))) # 出力: <class 'int'>
print(type(round(3.14, 0))) # 出力: <class 'int'>
print(type(round(3.14, 2))) # 出力: <class 'float'>
より厳密な四捨五入や型の一貫性が必要な場合は、decimalモジュールを使用することで解決できます。
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
# 通常の四捨五入(5以上切り上げ)
print(Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP)) # 出力: 3
print(Decimal('2.675').quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) # 出力: 2.68
# 偶数への丸め(Python標準のround関数と同様)
print(Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_EVEN)) # 出力: 2
print(Decimal('3.5').quantize(Decimal('1'), rounding=ROUND_HALF_EVEN)) # 出力: 4
NaNやInfinityの扱い
round関数は、NaN(非数)やInfinity(無限大)を引数に取ると、そのまま返します。
print(round(float('nan'))) # 出力: nan
print(round(float('inf'))) # 出力: inf
まとめ
Pythonで四捨五入を行うには、組み込み関数のroundを使用するのが最も一般的で簡単な方法です。基本的な使用法は非常にシンプルですが、偶数への丸めや浮動小数点数の精度の問題など、いくつかの注意点があります。
より厳密な計算が必要な場合や、特定の丸めルールが必要な場合は、decimalモジュールやmathモジュールの関数を利用することも検討してください。日常的なプログラミングのほとんどのケースでは、round関数で十分対応できるでしょう。