Python | ファイル操作など:round

Python
スポンサーリンク

概要(round は「数値を指定桁で丸める」ための基本関数)

round は、数値を最も近い値へ丸める組み込み関数です。小数点以下の桁数を指定でき、桁数を省略すると整数へ丸めます。重要なのは「Python の round は 0.5 の中間値を“偶数へ丸める(銀行丸め)”」という仕様と、浮動小数点の誤差により期待と違う結果になることがある点です。必要に応じて Decimal や math の関数と使い分けましょう。

print(round(3.6))          # 4(整数へ)
print(round(3.14159, 2))   # 3.14(小数点以下2桁)
print(round(12345, -2))    # 12300(百の位で丸め)
Python

基本の使い方(ここが重要)

引数の意味と戻り値(number, ndigits)

  • number: 丸めたい数値(int, float など)
  • ndigits: 小数点以下の桁数。省略時は最も近い整数に丸める。負の数を渡すと「整数部分の桁」で丸められる(-1 なら十の位、-2 なら百の位)。
print(round(3.14))         # 3(整数へ)
print(round(3.14159, 3))   # 3.142(小数点以下3桁)
print(round(9876, -1))     # 9880(十の位)
print(round(9876, -3))     # 10000(千の位)
Python

中間値 0.5 は「偶数へ丸め」になる(銀行丸め)

Python の round は、中間値(例: 2.5, 3.5, 0.5)を最も近い偶数へ丸めます。誤差を平均化するための仕様で、金融・統計で使われることがあります。

print(round(2.5))  # 2(偶数へ)
print(round(3.5))  # 4(偶数へ)
print(round(1.5))  # 2(偶数へ)
Python

浮動小数点の誤差に注意

2 進数で表現しづらい小数(0.1, 0.2 など)は内部的にわずかな誤差を持つため、丸め結果が期待と異なる場合があります。表示用途なら文字列フォーマット(f文字列や format)も検討しましょう。

x = 2.675
print(round(x, 2))           # 期待は 2.68 だが 2.67 になりうる
print(f"{x:.2f}")            # '2.68'(表示はフォーマットで安定)
Python

実務の使い分け(切り上げ・切り捨て・高精度丸め)

切り上げ・切り捨ては math.ceil / math.floor

round は「四捨五入」系。切り上げ・切り捨てが必要なら math を使います。負の数の挙動にも一貫性があります。

import math
print(math.ceil(3.2))   # 4(切り上げ)
print(math.floor(3.8))  # 3(切り捨て)
print(math.floor(-1.2)) # -2(負の数の切り捨ても一貫)
Python

金額や厳密な小数は Decimal が安全

金融計算など「丸め規則を厳密に指定したい」「誤差を許容できない」場合は Decimal を使い、丸め方式(ROUND_HALF_UP など)を明示します。

from decimal import Decimal, ROUND_HALF_UP, getcontext
getcontext().prec = 28

price = Decimal("2.675")
print(price.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP))  # 2.68(一般的な四捨五入)
Python

表示だけ丸めたいなら文字列フォーマット

内部値はそのままに、人に見せるときだけ桁を揃えたいなら f文字列や format を使うと誤差に強く、見た目が安定します。

value = 123.456789
print(f"{value:.3f}")     # '123.457'
print(format(value, ".2f"))  # '123.46'
Python

よくある落とし穴の深掘り(中間値・負の桁・型)

0.5 が「必ず切り上げ」ではない

  • 結論: Python の round は 0.5 を「偶数へ丸め」ます。
  • 対策: 一般的な「0.5 を常に切り上げ」挙動にしたいなら Decimal + ROUND_HALF_UP。

負の ndigits は「整数の桁」で丸める

  • 例: ndigits = -1 → 十の位、-2 → 百の位、-3 → 千の位。
  • 注意: 中間値(…5…)では銀行丸めが働くため結果が想定と異なる場合あり。
print(round(15, -1))     # 20(十の位で偶数へ)
print(round(25, -1))     # 20
print(round(35, -1))     # 40
Python

round の戻り型

  • ndigits を省略: int(整数)になることが多い。
  • ndigits を指定: float が返る(元が Decimal なら Decimal を使うべき)。

例題で身につける(定番から一歩先まで)

例題1:表示用に小数第2位まで丸めて整形

scores = [3.14159, 2.675, 2.5]
for s in scores:
    shown = f"{s:.2f}"           # 表示安定
    stored = round(s, 2)         # 内部は round でも可
    print(shown, stored)
Python

例題2:十の位・百の位でレポート数値を丸める

values = [123, 125, 135, 175]
rounded_10 = [round(v, -1) for v in values]   # 十の位
rounded_100 = [round(v, -2) for v in values]  # 百の位
print(rounded_10)
print(rounded_100)
Python

例題3:一般的な四捨五入(0.5 は切り上げ)で金額を丸める

from decimal import Decimal, ROUND_HALF_UP

def yen_round(x: str, ndigits: int = 0) -> Decimal:
    q = Decimal("1").scaleb(-ndigits)  # ndigits=2 → 0.01
    return Decimal(x).quantize(q, rounding=ROUND_HALF_UP)

print(yen_round("2.675", 2))  # 2.68
print(yen_round("123.5", 0))  # 124
Python

例題4:四捨五入して合計を出す(表示はフォーマット)

nums = [1.234, 2.345, 3.456]
rounded = [round(n, 2) for n in nums]
total = sum(rounded)
print(f"values={', '.join(f'{n:.2f}' for n in nums)} total={total:.2f}")
Python

まとめ

round は「最も近い値に丸める」ための基本関数で、桁指定(正・負)に対応し、実務で頻出します。中間値 0.5 は“偶数へ丸め”になる点と、浮動小数点の誤差に注意。切り上げ・切り捨ては math、厳密な四捨五入(0.5 は常に上へ)は Decimal を使う。表示だけ丸めるなら f文字列や format が安定。これらを使い分ければ、初心者でも丸め処理を短く、正確に、目的に合った形で書けます。

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