【round】Pythonで四捨五入する方法を解説

Python

本記事では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関数で十分対応できるでしょう。

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