【初心者向け】Pythonで四捨五入する方法まとめ|round関数・切り上げ・切り捨ても紹介!

python

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モジュール

コメント

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