Pythonのround()関数を徹底解説!数値の丸め処理と注意点


Pythonで数値を扱う際、計算結果が長すぎる小数になったり、特定の桁数で丸めたい場合があります。また、四捨五入、切り上げ、切り捨てなど、丸め方にもいくつか種類があります。これらの丸め処理を行うためにPythonが提供している組み込み関数が**round()関数**です。この記事では、round()関数の基本的な使い方から、注意すべき挙動、そしてint()関数との違いまでを初心者にもわかりやすく解説しますします。

round()関数とは?Pythonにおける数値の丸め処理

Pythonのround()関数は、引数として与えられた数値を最も近い整数、または指定された小数点以下の桁数に丸めるための組み込み関数です。

基本的な使い方:2つの形式

round()関数には、主に2つの使い方があります。

1. 引数が1つの場合:最も近い整数に丸める

数値を1つだけ引数に渡すと、その数値に最も近い整数に丸められます。このとき、結果は**整数(int型)**になります。

Python
 
# 小数点以下を四捨五入(一般的な四捨五入と同じ挙動)
print(round(3.14)) # 出力: 3
print(round(3.7))  # 出力: 4

# ちょうど中間の値の場合の注意点
# Python 3からは、偶数への丸め(bankers' rounding)がデフォルト
print(round(2.5))  # 出力: 2
print(round(3.5))  # 出力: 4
print(round(4.5))  # 出力: 4

重要な注意点: 「四捨五入」の認識とのずれ(偶数への丸め)

多くの人が「四捨五入」と聞いて想像するのは「小数点以下が0.5以上なら切り上げ、0.5未満なら切り捨て」というルールだと思います。しかし、round()関数が引数を1つだけとる場合、Python 3からは**「偶数への丸め(Bankers’ Rounding、最近接偶数への丸め)」**がデフォルトの挙動になっています。

  • ちょうど0.5の場合: 最も近い偶数に丸められます。

    • 2.52 に丸められます(2が偶数)。

    • 3.54 に丸められます(4が偶数)。

  • 0.5以外の場合: 通常の四捨五入と同じ挙動です。

これは、統計処理において丸め誤差が偏るのを防ぐための、より公平な丸め方とされています。しかし、一般的な四捨五入を期待していると戸惑うかもしれません。

2. 引数が2つの場合:指定した桁数で丸める

数値を最初の引数に、小数点以下何桁まで残すかをndigitsという2つ目の引数に指定します。このとき、結果は**浮動小数点数(float型)**になります。

Python
 
# 小数点以下2桁に丸める
print(round(3.14159, 2)) # 出力: 3.14
print(round(123.4567, 3)) # 出力: 123.457

# 負の数を指定すると、小数点より左側(整数部分)で丸める
print(round(12345, -2)) # 出力: 12300.0 (百の位で丸める)
print(round(56789, -3)) # 出力: 57000.0 (千の位で丸める)

# ndigitsを0にすると、最も近い整数に丸められるが、結果はfloatになる
print(round(2.5, 0)) # 出力: 2.0 (偶数への丸めが適用されfloatで返る)
print(round(3.5, 0)) # 出力: 4.0 (偶数への丸めが適用されfloatで返る)

この場合も、小数点以下がちょうど0.5で、かつ丸められる桁の直前が奇数の場合は偶数への丸めが適用されます。

round()関数を使用する際の注意点

浮動小数点数の精度問題

round()関数を使う上で、浮動小数点数自体の精度に関する問題も理解しておく必要があります。コンピュータ内部では、小数が正確に表現できない場合があるため、見た目と実際の値にわずかなズレが生じることがあります。これがround()の結果に影響を与えることがあります。

Python
 
# 実際の値は0.5ではない可能性があるため、偶数への丸めが適用されないケースがある
print(round(2.675, 2)) # 期待は2.68だが、出力は2.67になることがある
                      # 内部表現によっては2.6749999...のように扱われるため

このような厳密な丸めが必要な場合は、decimalモジュールを使用するのが一般的です。

round()関数と他の丸め処理との違い

int()関数との違い(切り捨て)

round()関数が「最も近い整数に丸める(四捨五入または偶数への丸め)」のに対し、int()関数は常に小数点以下を「切り捨て」ます

Python
 
print(round(3.7)) # 出力: 4 (丸め)
print(int(3.7))   # 出力: 3 (切り捨て)

print(round(-3.7)) # 出力: -4 (負の数の場合も最も近い整数)
print(int(-3.7))   # 出力: -3 (負の数では0に近づく方向へ切り捨て)

切り上げ・切り捨て(mathモジュール)

一般的な「切り上げ」や「切り捨て」を厳密に行いたい場合は、mathモジュールが提供する関数を利用します。

  • math.ceil(x): x以上の最小の整数(切り上げ)

  • math.floor(x): x以下の最大の整数(切り捨て)

Python
 
import math

print(math.ceil(3.14))  # 出力: 4
print(math.floor(3.7)) # 出力: 3

print(math.ceil(-3.14)) # 出力: -3
print(math.floor(-3.7)) # 出力: -4

decimalモジュール(厳密な丸め)

金融計算など、高い精度と厳密な丸めルールが必要な場合は、Python標準ライブラリの**decimalモジュール**を使用することが強く推奨されます。decimalモジュールは、浮動小数点数の精度問題を回避し、様々な丸め方式(四捨五入、切り上げ、切り捨て、偶数への丸めなど)を明示的に指定できます。

Python
 
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

# 通常の四捨五入(ROUND_HALF_UP: 0.5は切り上げ)
d1 = Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(f"Decimal (ROUND_HALF_UP 2.5): {d1}") # 出力: Decimal (ROUND_HALF_UP 2.5): 3

# 偶数への丸め(ROUND_HALF_EVEN: round()と同じ挙動)
d2 = Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_EVEN)
print(f"Decimal (ROUND_HALF_EVEN 2.5): {d2}") # 出力: Decimal (ROUND_HALF_EVEN 2.5): 2

まとめ

Pythonのround()関数は、数値を丸めるための便利な組み込み関数ですが、特に引数が1つの場合の「偶数への丸め」の挙動を理解しておくことが重要です。一般的な四捨五入とは異なる場合があるため、用途に応じてint()mathモジュールのceil/floor、あるいはより厳密なdecimalモジュールとの使い分けが必要です。

  • round(number): 最も近い整数に丸め、int型を返します。0.5の場合は偶数への丸めが適用されます。

  • round(number, ndigits): 指定した小数点以下の桁数に丸め、float型を返します。ここでも0.5のルールは同様です。

  • 小数点以下の精度問題により、予期せぬ結果になる場合があるため、厳密な計算にはdecimalモジュールを検討しましょう。

  • 切り捨てint()切り上げ/切り捨てmath.ceil()/math.floor()を使用します。

この関数を正確に理解し、プロジェクトの要件に合わせて適切な丸め処理を選択できるようになりましょう。


らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座