Pythonで数値を扱うとき、「小数点以下を四捨五入して整数にしたい」や「桁数を決めて四捨五入したい」という場面はよくあります。
この記事では、Pythonで四捨五入をするやり方を分かりやすく説明し、round()
関数、math
モジュール、decimal
モジュールなど、いろいろな方法と注意すべきポイントを紹介します。
round()関数:Pythonの基本的な四捨五入

基本的な使い方
コード例
print(round(3.6)) # 4
print(round(3.2)) # 3
print(round(5.0)) # 5
説明:3.6は4に、3.2は3になります。これが一番基本的な四捨五入です。
桁数を指定して四捨五入
小数点以下の桁数を指定することもできます。
コード例
print(round(3.14159, 2)) # 3.14 (小数点以下2桁)
print(round(3.14159, 3)) # 3.142 (小数点以下3桁)
print(round(123.456, 1)) # 123.5 (小数点以下1桁)
説明:2番目の数字で、残したい小数点以下の桁数を指定します。
整数の桁で四捨五入
マイナスの数字を使うと、整数の桁で四捨五入できます。
コード例
print(round(123.456, 0)) # 123.0 (整数にする)
print(round(123.456, -1)) # 120.0 (10の位で四捨五入)
print(round(123.456, -2)) # 100.0 (100の位で四捨五入)
説明:-1だと10の位、-2だと100の位で四捨五入されます。
重要な注意点:Pythonのround()は「銀行丸め」
Pythonのround()
は、0.5のときに特別なルールがあります。
コード例
print(round(2.5)) # 2 (偶数の2になる)
print(round(3.5)) # 4 (偶数の4になる)
print(round(4.5)) # 4 (偶数の4になる)
print(round(5.5)) # 6 (偶数の6になる)
説明:0.5のときは、一番近い偶数になります。これを「銀行丸め」や「偶数丸め」と呼びます。普通の四捨五入とはちがうので注意しましょう。
mathモジュールを使った切り上げ・切り捨て
math
モジュールには、常に切り上げや切り捨てをする関数があります。
コード例
import math
# 切り捨て(常に下に丸める)
print(math.floor(3.1)) # 3
print(math.floor(3.9)) # 3
# 切り上げ(常に上に丸める)
print(math.ceil(3.1)) # 4
print(math.ceil(3.9)) # 4
説明:
math.floor()
:どんな小数でも切り捨てmath.ceil()
:どんな小数でも切り上げ
負の数での動作
負の数のときの動作も確認してみましょう。
コード例
import math
print(math.floor(-3.1)) # -4 (より小さい方向)
print(math.ceil(-3.1)) # -3 (より大きい方向)
説明:負の数では、floor
はより小さく(マイナス方向)、ceil
はより大きく(ゼロ方向)なります。
decimalモジュールで正確な四捨五入

お金の計算などで、正確な四捨五入が必要なときはdecimal
モジュールを使います。
コード例
from decimal import Decimal, ROUND_HALF_UP
# 文字列で数値を指定する
num = Decimal('2.5')
rounded = num.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(rounded) # 3
num2 = Decimal('3.5')
rounded2 = num2.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(rounded2) # 4
説明:ROUND_HALF_UP
を使うと、0.5のときは常に切り上げになります。これが一般的な四捨五入です。
小数点以下の桁数を指定する
コード例
from decimal import Decimal, ROUND_HALF_UP
# 小数点以下2桁で四捨五入
num = Decimal('3.14159')
rounded = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded) # 3.14
# 小数点以下1桁で四捨五入
num2 = Decimal('3.15')
rounded2 = num2.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
print(rounded2) # 3.2
説明:Decimal('0.01')
は小数点以下2桁、Decimal('0.1')
は小数点以下1桁を意味します。
自作関数で四捨五入
自分で四捨五入の関数を作ることもできます。
コード例
def my_round(n):
"""一般的な四捨五入(0.5は常に切り上げ)"""
if n >= 0:
return int(n + 0.5)
else:
return int(n - 0.5)
print(my_round(2.5)) # 3
print(my_round(3.5)) # 4
print(my_round(-2.5)) # -3
print(my_round(-3.5)) # -4
説明:この関数では、0.5のときは常に切り上げになります。
桁数を指定できる自作関数
コード例
def my_round_digits(n, digits=0):
"""桁数を指定できる四捨五入"""
multiplier = 10 ** digits
if n >= 0:
return int(n * multiplier + 0.5) / multiplier
else:
return int(n * multiplier - 0.5) / multiplier
print(my_round_digits(3.14159, 2)) # 3.14
print(my_round_digits(2.5, 0)) # 3.0
NumPyやpandasでの四捨五入
たくさんの数値を一度に処理するときは、NumPyやpandasが便利です。
NumPyでの四捨五入
コード例
import numpy as np
# 配列の四捨五入
data = np.array([1.2, 2.7, 3.5, 4.1])
print(np.round(data)) # [1. 3. 4. 4.]
# 桁数を指定
data2 = np.array([1.234, 2.567, 3.891])
print(np.round(data2, 2)) # [1.23 2.57 3.89]
pandasでの四捨五入
コード例
import pandas as pd
# DataFrameの四捨五入
df = pd.DataFrame({
'名前': ['田中', '鈴木', '佐藤'],
'点数': [85.67, 92.34, 78.99]
})
df['点数(四捨五入)'] = df['点数'].round(1)
print(df)
結果
名前 点数 点数(四捨五入)
0 田中 85.67 85.7
1 鈴木 92.34 92.3
2 佐藤 78.99 79.0
よくある問題と解決方法

問題1:0.5が思った通りにならない
症状:round(2.5)
が3ではなく2になる
原因:Pythonのround()
は「銀行丸め」を使っている
解決方法:decimal
モジュールや自作関数を使う
コード例
from decimal import Decimal, ROUND_HALF_UP
# Pythonの標準
print(round(2.5)) # 2
# decimal を使用
num = Decimal('2.5')
result = num.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(result) # 3
問題2:浮動小数点数の誤差
症状:round(2.675, 2)
が2.68ではなく2.67になる
原因:コンピューターは小数を正確に表現できない場合がある
解決方法:decimal
モジュールを使って文字列で数値を指定する
コード例
from decimal import Decimal, ROUND_HALF_UP
# 浮動小数点数では誤差が生じる可能性
print(round(2.675, 2)) # 2.67 (期待値: 2.68)
# decimalを使用
num = Decimal('2.675')
result = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(result) # 2.68
問題3:負の数での切り上げ・切り捨て
症状:負の数でmath.ceil()
やmath.floor()
の動作が分からない
解決方法:数直線で考える
コード例
import math
# 正の数
print(math.floor(3.7)) # 3 (左に向かう)
print(math.ceil(3.2)) # 4 (右に向かう)
# 負の数
print(math.floor(-3.2)) # -4 (左に向かう、より小さく)
print(math.ceil(-3.7)) # -3 (右に向かう、より大きく)
まとめ:用途に応じて使い分けよう!
方法 | 特徴 | 使う場面 | 例 |
---|---|---|---|
round() | 基本的な丸め(銀行丸め) | 一般的な計算 | round(2.5) → 2 |
math.floor() | 常に切り捨て | 下限値が欲しいとき | floor(3.9) → 3 |
math.ceil() | 常に切り上げ | 上限値が欲しいとき | ceil(3.1) → 4 |
decimal | 正確な商業計算 | お金の計算 | ROUND_HALF_UP で2.5→3 |
自作関数 | カスタムルール | 特別な要件があるとき | 独自の四捨五入ルール |
NumPy/pandas | 大量データ処理 | データ分析 | 配列やDataFrameの一括処理 |
どの方法を選ぶべき?
- 普通の計算:
round()
関数 - 常に0.5を切り上げたい:
decimal
モジュール - お金の計算:
decimal
モジュール - 大量のデータ:NumPyやpandas
- 常に切り上げ・切り捨て:
math
モジュール
コメント