Courses
Pythonで数値を小数点以下2桁に丸めることは重要なテクニックです。特に、財務計算、データの見せ方、科学技術分野のレポーティングで有用です。
Pythonには精度の高い丸めを行うためのさまざまな方法があります。本チュートリアルでは、組み込み関数、ライブラリ、フォーマット手法を使って、数値を小数点以下2桁に丸める方法を紹介します。
データアナリストとして学び始めたばかりの場合は、DataCamp のIntroduction to Pythonコースで、データ操作や変換に必要なPythonの基礎を学ぶことをおすすめします。データ分析のワークフローで大量の配列を丸める必要があるなら、Python NumPy チュートリアルも役立ちます。
要点まとめ(TL;DR)
-
算術的に値そのものを丸めるには、
round(number, 2)を使います。 -
表示用に丸めるだけなら
f"{number:.2f}"またはstr.format()を使います(元の浮動小数点数は変わりません)。 -
厳密な10進精度が必要な場合(例:財務計算)は
decimalモジュールを使います。 -
NumPy 配列全体を一度に丸めるには
np.round(array, 2)を使います。 -
浮動小数点の精度に注意:
round(2.675, 2)は2.68ではなく2.67を返します。これはメモリ上での浮動小数点の表現方法が原因です。
丸めと小数桁の基礎
小数点以下の桁数は、数値の小数点の直後に現れる数字のことです。小数桁は数値の精度を決める重要な要素で、桁数が多いほど精度が高くなり、その逆も然りです。
数値の丸めは、小数桁数を減らして数値を調整することを指します。計算結果の見通しをよくし、一貫性を保つために用いられますが、特定の小数桁に丸めると小さな誤差が生じ、計算値の正確さに影響する点には注意が必要です。
Pythonには小数点以下2桁に丸めるためのいくつかの方法があります。以下の例で、それぞれのテクニックを詳しく説明します。
Pythonで round() を使って丸める
round() は、指定した小数桁まで浮動小数点数を丸めるためのPythonの組み込み関数です。第2引数に桁数を指定します。次の例は 34.15 を出力します。
# Example number to be rounded
number = 34.14559
# Rounding the number to 2 decimal places
rounded_number = round(number, 2)
print(rounded_number)
# 34.15
Python の round() は、第2引数を省略した場合のデフォルトの丸めモードとして「偶数丸め(round half to even、いわゆる銀行家の丸め)」を使います。ちょうど中間の値は最も近い偶数の整数に丸められます。累積的な丸め誤差を抑えるのに有用な手法です。
round() による浮動小数点精度の落とし穴
財務系のコードで round() に依存する前に知っておきたい細かいポイントがあります。次を試してください。
print(round(2.675, 2)) # You might expect 2.68
# Output: 2.67
結果は 2.68 ではなく 2.67 です。2.675 は2進の浮動小数点(IEEE 754)で正確に表せず、実際に格納される値は 2.675 よりわずかに小さいため、Python は切り下げます。
財務計算で厳密な丸めが必要なら、明示的な丸めモード付きで decimal モジュールを使ってください。
from decimal import Decimal, ROUND_HALF_UP
result = Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(result) # 2.68
文字列フォーマットでPythonの数値を丸める
文字列フォーマットは、特に出力で数値を表示する際に、小数点以下2桁に丸めるのに便利です。
Pythonで文字列フォーマットを使って丸めた場合、表示されるのは文字列であり、元の数値は変わりません。元の数値で計算を行うと未丸めの値に基づくため、思わぬ結果になることがあります。
% 演算子での丸め
% 演算子は、数値を小数点以下2桁にフォーマットする伝統的な方法です。プレースホルダーに値を挿入して整形済み文字列を作れます。
次の例では、f は浮動小数点数を、.2 は丸める小数桁を指定します。
# Example number to be rounded
number = 3.14159
# Using the % operator to round to 2 decimal places
formatted_number = "%.2f" % number
print(formatted_number)
# 3.14
str.format() での丸め
str.format() は、より柔軟に複雑な丸めを扱える方法です。名前付きプレースホルダーが使えるため、開発者は % 演算子よりこちらを好む傾向があります。次の例では、中括弧内の :.2f が「小数点以下2桁に丸めて表示」を指定しています。出力は 3.14 です。
# Example number to be rounded
number = 3.14159
# Using str.format() to round to 2 decimal places
formatted_number = "{:.2f}".format(number)
print(formatted_number)
# 3.14
f-string(Python 3.6+)での丸め
f-string は Python 3.6で導入され、文字列に値を埋め込む推奨手段になりました。f-string 構文は丸めの指定が特に簡潔で、別関数を呼ばず1行で表示フォーマットが完結します。次のコードは 14.68 を出力します。
# Example number to be rounded
number = 14.67856
# Using f-strings to round to 2 decimal places
formatted_number = f"{number:.2f}"
print(formatted_number)
# 14.68
format() で丸める
組み込みの format() 関数は、値とフォーマット指定子を受け取り、整形済み文字列を返します。str.format() と違い、テンプレート文字列に埋め込むのではなく、数値を直接渡します。次のコードは 345.69 を出力します。
# Example number to be rounded
number = 345.68776
# Using the built-in format() to round to 2 decimal places
formatted_number = format(number, ".2f")
print(formatted_number)
# 345.69
その他のモジュールで丸める
標準的なPython以外にも、丸めに使えるモジュールがいくつかあります。ここでは代表的な3つ、math、decimal、NumPy を紹介します。
math モジュールでの丸め
math モジュールには、特定の小数桁に直接丸める関数はありません。ただし、math と算術を組み合わせることで、小数点以下2桁に丸められます。
math.floor() は最も近い下の整数に切り捨てる関数です。小数点以下2桁に切り捨てるには、値を100倍して math.floor() を適用し、その後100で割ります。次のコードは 3.14 を出力します。
# Import math module
import math
# Example number to be rounded
number = 3.14159
# Using math.floor() to round down to 2 decimal places
rounded_down = math.floor(number * 100) / 100
print(rounded_down)
# 3.14
同様に、math.ceil() は最も近い上の整数に切り上げます。小数点以下2桁に切り上げるには、100倍して math.ceil() を適用し、100で割ります。次のコードは 3.15 を出力します。
# Import the math module
import math
# Example number to be rounded
number = 3.14159
# Using math.ceil() to round up to 2 decimal places
rounded_up = math.ceil(number * 100) / 100
print(rounded_up)
# 3.15
decimal モジュールでの丸め
Python の decimal モジュールは、.quantize() メソッドを使って、指定した小数桁へ高精度に丸める際に便利です。以下では 0.01 を指定して小数点以下2桁に丸めています。
# Import the decimal module
from decimal import Decimal
# Example number to be rounded
number = Decimal("18.73869")
# Define the rounding precision to 2 decimal places
precision = Decimal('0.01')
# Using the quantize method with ROUND_UP
# to round the number up to 2 decimal places
rounded_number = number.quantize(precision)
print(rounded_number)
# 18.74
常に切り上げる動作など特定の丸め方を詳しく知りたい場合は、最新チュートリアル「Pythonで切り上げを行う方法」をご覧ください。math や decimal の使い方、常に切り上げ(切り捨て)にするテクニックを解説しています。より広くデータ変換を学びたい場合は、分析スキルを伸ばせる Data Analyst with Python キャリアトラックもおすすめです。
NumPy での丸め
NumPy の配列を扱うときは、np.round() を使うと要素を一括で丸められます。手作業でループするより高速かつ可読性に優れます。
import numpy as np
prices = np.array([1.2345, 9.8765, 3.14159])
rounded_prices = np.round(prices, 2)
print(rounded_prices)
# [1.23 9.88 3.14]
np.round() は Python 組み込みの round() と同じ銀行家の丸め規則を適用します。pandas の DataFrame や Series でも .round() は同様に動作します。
import pandas as pd
df = pd.DataFrame({"price": [1.2345, 9.8765, 3.14159]})
df["price_rounded"] = df["price"].round(2)
print(df)
# price price_rounded
# 0 1.2345 1.23
# 1 9.8765 9.88
# 2 3.14159 3.14
pandas を使ったデータ変換の概要は、pandas チュートリアルをご覧ください。
Pythonの丸め方を使い分ける場面
用途ごとに適した丸めの選び方を簡単にまとめます。
| Method | Best for | Changes value? | Returns |
|---|---|---|---|
round(x, 2) |
一般的な算術 | Yes | float |
f"{x:.2f}" |
表示/出力 | No | str |
str.format() |
表示/出力 | No | str |
% operator |
表示/出力(レガシー) | No | str |
format(x, ".2f") |
表示/単一値 | No | str |
math.floor() / ceil() |
常に切り捨て/常に切り上げ | Yes | float |
Decimal.quantize() |
財務/厳密な10進 | Yes | Decimal |
np.round(arr, 2) |
NumPy 配列 | Yes | ndarray |
選択の目安となるルール:
-
表示するだけですか? f-string(
f"{x:.2f}")を使いましょう。1行、インポート不要、元の値に副作用なし。 -
結果でさらに計算しますか?
round(x, 2)を使います。継続して計算できる float を返します。 -
財務・会計コードですか?
Decimal.quantize()を使います。decimalモジュールではround(2.675, 2) == 2.67のような浮動小数点の驚きは起きません。 -
常に切り上げ/切り捨てしたい?
math.ceil()またはmath.floor()を使います。通常の丸め規則は無視します。 -
NumPy 配列や pandas 列で作業中?
np.round(arr, 2)またはseries.round(2)を使いましょう。コレクション全体を一度に処理できます。 -
古いコードを保守中?
%演算子も動作しますが、Python 3.6 以降は f-string が主流です。新しいコードでは f-string を推奨します。
まとめ
小数点以下2桁への丸めは、財務や科学計算の精度管理に欠かせないテクニックです。この記事では、組み込み関数、文字列フォーマット、math モジュールなどを使った複数の方法を紹介しました。必要な精度や表示形式など要件に応じて、適切な方法を選ぶことが重要です。用途に合わせてさまざまな方法を試し、最適な手法を身につけてください。
Python スキルをさらに伸ばしたい方は、関数やデコレーター、発展的なパターンを扱う Python Programming スキルトラックをご覧ください。より高度なデータ構造やアルゴリズムも学べる Python Developer キャリアトラックも用意しています。
よくある質問
Pythonで数値を小数点以下2桁に丸める最も簡単な方法は何ですか?
最も簡単な方法は、組み込み関数の round() を使うことです。
round() を使うと整数に丸められるのはなぜですか?
round() のデフォルトは偶数丸め(round half to even)です。小数点以下2桁に丸めるには、第2引数に 2 を渡します。例:round(3.14159, 2)。
format() 関数は小数点以下2桁に丸める際にどのように使いますか?
format() 関数は、指定した小数桁に丸めて整形済み文字列として表示するために使います。
round half to even(偶数丸め)とは何ですか?
偶数丸め(銀行家の丸め)は、ちょうど中間の値を最も近い偶数の整数に丸める方法です。
math モジュールで小数点以下2桁に丸められますか?
math.floor() や math.ceil() は、他の算術と組み合わせることで、指定の小数桁に丸めるのに使えます。
round(2.675, 2) が 2.68 ではなく 2.67 を返すのはなぜですか?
これは浮動小数点の精度に起因する問題です。2.675 は2進の浮動小数点(IEEE 754)で正確に表せないため、格納される値は 2.675 よりわずかに小さくなり、Python は 2.67 に丸め下げます。
財務コードでこれを避けるには、明示的な丸めモードを指定して decimal モジュールを使います。Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) は期待どおり 2.68 を返します。
pandas の DataFrame の全ての値を小数点以下2桁に丸めるには?
DataFrame や Series では .round() メソッドを使います。単一の列を丸めるには:df["price"] = df["price"].round(2)。数値列をまとめて丸めるには:df = df.round(2)。