Pythonで四捨五入しようと思って round() を使ったのに、「あれ?思った結果にならない…」と困った経験、ありませんか?
実は Python の丸め処理には “独特のルール” があり、知らないと 計算がズレる・金額が合わない・分析結果が変わる といった問題が起こりがちです。
特に 0.5 が切り上がらない現象は、多くの人がつまずくポイントです。
この記事では、round() の正しい使い方はもちろん、桁指定・切り捨て・切り上げ・Banker’s rounding の注意点・decimal の精密計算まで徹底的に解説します。
実務でそのまま使えるサンプルコードも豊富に載せているので、この記事を読み終える頃には「Pythonの丸め処理はもう怖くない」と自信を持てるはずです。
Pythonで四捨五入する方法をわかりやすく解説【結論:round関数が基本】
Pythonで四捨五入をするなら、まず覚えておくべきは round関数 です。
まずは、round関数の基本構文と使い方を解説します。
round関数の基本構文と使い方
Pythonの四捨五入と聞いて、まず使うのが round() 関数です。構文はシンプルで、round(数値, 桁数) のように書きます。
桁数を省略すれば整数に丸め、桁数を指定すれば小数点以下を自由にコントロールできます。
とりあえず基本を押さえるなら、以下のコードを試してみてください。
print(round(3.14159)) # -> 3
print(round(3.14159, 2)) # -> 3.14
print(round(3.14159, 3)) # -> 3.142
round は「シンプルな四捨五入」と思われがちですが、Pythonでは独特の丸めルールが採用されています。
後ほど詳しく触れますが、まずは基本の使い方を理解しておけばOKです。
四捨五入・切り捨て・切り上げの違いを理解しよう
丸め処理には「四捨五入」「切り捨て」「切り上げ」の3種類があります。
四捨五入は5以上なら上へ、未満なら下へ丸める一般的な方法。一方、切り捨ては常に「下へ」寄せ、切り上げは常に「上へ」寄せます。
Pythonでは round() が四捨五入、math.floor() が切り捨て、math.ceil() が切り上げとして使われます。
import math
print(round(3.6)) # -> 4
print(math.floor(3.6)) # -> 3
print(math.ceil(3.2)) # -> 4
同じ「丸め」でも結果が大きく変わるので、値をどう扱いたいのかで使い分けるのが大事です。
roundが正しく動かない?よくある誤解と注意点
Pythonの round() を使っていて、「あれ? 0.5 が切り上がらない?」という経験はありませんか?
これはPythonの丸めが「Banker’s rounding(偶数丸め)」という方式を採用しているため。
端数がちょうど0.5のとき、偶数側に丸める仕様です。
つまり、round(1.5) は 2 になりますが、round(2.5) は 2 になります。
print(round(1.5)) # -> 2
print(round(2.5)) # -> 2
これはバグではなく、統計的に誤差を少なくするための仕様です。
金融計算など「必ず5は切り上げたい」場合は、後で紹介する decimal を使うほうが安全です。
round関数でよく使うパターン別サンプルコード
round関数は「小数点以下の丸め」だけでなく、「10の位」「100の位」「マイナス値」など、実務で頻繁に使うさまざまな丸め方に対応できます。
ここでは、特によく使われる3パターンを紹介します。
コードをそのままコピペして動かせるようにしているので、まずは手を動かして試してみてください。
丸めは一度理解すると応用が効くので、ぜひ自分の業務に合わせてアレンジしてみましょう。
小数点以下を四捨五入する方法(例:2桁など)
小数点以下を丸めたい場面はかなり多いです。たとえば金額の表示、小数点以下2桁の数値整形などが典型例。
roundなら round(値, 桁数) の第二引数を変えるだけでOKです。
value = 3.141592
print(round(value, 1)) # -> 3.1
print(round(value, 2)) # -> 3.14
print(round(value, 3)) # -> 3.142
第二引数に負の値を入れると、今度は整数側の桁数を丸められます。
これも後ほど解説しますが「小数は正の桁数、整数は負の桁数」と覚えるだけで一気に使いこなせます。
整数単位・10の位・100の位などを丸める方法
整数の丸めには、round関数の第二引数に「負の値」を指定します。
これが意外と知られていませんが、すごく便利です。
num = 1234
print(round(num, -1)) # -> 1230(10の位)
print(round(num, -2)) # -> 1200(100の位)
print(round(num, -3)) # -> 1000(1000の位)
このテクニックは「売上データの概算」「統計データのざっくり丸め」などでも頻繁に使います。
桁数をマイナスで指定するだけでOKなので、覚えておくとめちゃくちゃ便利です。
マイナスの値を四捨五入する際の挙動
意外とつまずくのが「負の値の丸め」。
roundは正の値と同様に偶数丸めをしますが、直感と違って見える場合があります。
print(round(-1.5)) # -> -2(偶数側へ)
print(round(-2.5)) # -> -2
print(round(-3.6)) # -> -4
負の値は「どちらが偶数か」を軸に丸められます。
これは誤動作ではなく、Pythonの仕様です。
金額の返金処理や損益計算など、負の数を扱う場面は意外と多いので、早めに理解しておくと安心です。
round関数の落とし穴:Python特有の丸め仕様「Banker’s rounding」とは
Pythonの四捨五入で最もハマりやすいポイントが「Banker’s rounding(バンカーズラウンディング)」です。
これは “0.5 を無条件に切り上げない” という特殊な丸め方式。
端数が0.5のとき、偶数に寄せて丸めるため、直感的じゃない結果が出ることがあります。
たとえば「2.5 を round したら 2 になる」という挙動。
統計的な誤差を小さくするために採用されている仕様ですが、金融・請求書の計算など “必ず切り上げたい” 場面では注意が必要です。
なぜ0.5が切り上がらないことがあるのか
Pythonの round() が0.5を切り上げない理由は、「偶数丸め」というルールを採用しているからです。
0.5は真ん中の値なので、毎回切り上げると誤差が偏ってしまいます。
そこで、2.5→2、1.5→2 のように “偶数側へ寄せる” ことで、全体の誤差を平均化しようという考え方です。
print(round(1.5)) # -> 2
print(round(2.5)) # -> 2
print(round(3.5)) # -> 4
これは統計的には正しい丸めですが、会計・金額計算に使うと「意図と違う結果」に見えるので注意が必要です。
金融計算で注意すべき理由
金融計算では “5 は必ず切り上げたい” というケースが多いため、round() をそのまま使うのは危険です。
たとえば消費税の端数処理や請求金額の調整などでは「四捨五入」なのか「切り上げ」なのかが厳密に決まっています。
Banker’s rounding を使うと、2.5 が 2 になってしまい、意図しない誤差が発生します。
こうした場合は decimal.Decimal の ROUND_HALF_UP を使い、明示的に丸めルールを指定するのが安全です。
後ほど実例コード付きで詳しく紹介します。
round関数の挙動を検証できるサンプルコード
「roundがどう丸めているのか確認したい」というときは、0.5刻みの数値を並べてチェックするのが一番わかりやすいです。
下のコードは、0.5ごとの値を一気に round して挙動を確認できる実用的なサンプル。
for n in [1.5, 2.5, 3.5, 4.5, -1.5, -2.5, -3.5]:
print(n, "→", round(n))
このコードを実行すると、Pythonが偶数側へ丸めていることがよく理解できます。
まずはこの動きを理解しておくことで、意図しない丸めミスを防げます。
切り上げ・切り捨て・任意の丸めをしたい場合の代替手法
round関数は便利ですが、実務では「必ず切り上げたい」「必ず切り捨てたい」「特定の丸めルールを適用したい」といったケースも多いです。
Pythonでは、こうしたニーズに応えるためのモジュールが標準で用意されています。
代表的なのが math.floor()(切り捨て)、math.ceil()(切り上げ)、そして精密な丸めが必要なときは decimal.Decimal。
roundより自由度が高く、金融・統計・請求書処理などでよく使われるので、ここでしっかり使い方を押さえておきましょう。
math.floor(切り捨て)・math.ceil(切り上げ)で正確な丸めを実装
「常に切り捨てたい」「常に切り上げたい」なら、math モジュールが最適です。floorは小数点以下を必ず“下へ”、ceilは必ず“上へ”丸めます。
import math
print(math.floor(3.7)) # -> 3
print(math.ceil(3.1)) # -> 4
特に、数値の区間分けや「1円未満を必ず切り捨てる」ような税計算で役立ちます。
roundよりも意図が明確に反映されるため、丸めルールが厳密に決まっている処理には floor/ceil を使うほうが安全です。
decimalモジュールで四捨五入を厳密に制御する方法
金融計算や高精度な演算が必要な場面では decimal.Decimal が最強です。ROUND_HALF_UP を使えば「5は必ず切り上げ」という一般的な四捨五入が実現できます。
from decimal import Decimal, ROUND_HALF_UP
value = Decimal("2.5")
result = value.quantize(Decimal("1"), rounding=ROUND_HALF_UP)
print(result) # -> 3
roundでは偶数丸めになるため意図と違う結果になることがありますが、decimalなら丸め方を完全にコントロールできます。
消費税計算、請求金額の調整など実務では必須級のテクニックです。
金融計算・統計処理に最適な丸めの選び方
丸め処理を選ぶときは「どんな誤差を許容できるか」を基準に考えます。
・誤差を平均化したい → round(偶数丸め)
・金額計算で“5を必ず切り上げたい” → decimal + ROUND_HALF_UP
・必ず切り捨て/切り上げが必要 → math.floor / math.ceil
・係員の指示や法的ルールに従う必要がある → decimalが最適
統計・機械学習などでは誤差の偏りを避けたいので round が適しており、金融系では decimal が必須。
目的に応じて丸め処理を選ぶことで、思わぬ計算ミスを防げます。
実務で使える丸め処理の実践例
丸め処理は、プログラミングの中でも特に“実務でよく使うスキル”です。
請求書の金額計算、データ分析の数値整形、あるいは社内ツールの数値フォーマットなど、多くの場面で登場します。
ここでは、実務に直結する3つの具体的なケースを紹介します。
どれもそのままコピペで使えるコード付きなので、自分の業務に合わせて応用してください。
丸め処理は「どのルールを選ぶか」が最重要です。
場面に応じた正しい丸め方を理解しておくことで、計算ミスを未然に防げるようになります。
金額計算での四捨五入(請求書・税計算など)
金額計算で一番多いのが「四捨五入」と「切り上げ」です。
特に消費税計算では、端数処理のルールが会社ごとに違うため注意が必要です。
一般的な四捨五入は decimal を使うのが安全です。
from decimal import Decimal, ROUND_HALF_UP
price = Decimal("1980") # 税抜
tax = price * Decimal("0.1") # 消費税
total = (price + tax).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
print(total) # -> 2178
roundの偶数丸めを使うと、特定の金額で誤差が出ることがあります。
金額計算では ROUND_HALF_UP を使うのが定番です。
データ分析での数値整形(平均値・割合の丸め)
データ分析では「小数点以下の整形」がよく発生します。
平均値や割合の表示では、小数点以下2桁などに揃えることが多いです。
見やすさと一貫性を保つため、roundを使って整形します。
values = [3, 5, 8, 10]
avg = sum(values) / len(values)
print(round(avg, 2)) # -> 6.5
分析レポートでは「2桁固定」「3桁固定」などのフォーマットが求められるため、roundの第二引数を活用するだけで整った数値にできます。
場面によってはフォーマット文字列で整形する方法も併用します。
四捨五入処理を関数化して再利用する方法
業務アプリやバッチ処理では「毎回同じ丸め処理を使いたい」といった場面があります。
こういうときは関数化しておくと便利です。decimal を使って “5 で切り上げ” を安定して適用できます。
from decimal import Decimal, ROUND_HALF_UP
def round_half_up(value, digits=0):
q = Decimal("1") / (10 ** digits)
return Decimal(str(value)).quantize(q, rounding=ROUND_HALF_UP)
print(round_half_up(2.5)) # -> 3
print(round_half_up(3.1415, 2)) # -> 3.14
関数化しておけば、社内システムや分析スクリプトで丸めルールを統一でき、ミスの防止にもつながります。
目的別まとめ:Pythonで最適な「四捨五入」手法はどれ?
ここまで見てきたように、Pythonの丸め処理は「どのルールで丸めたいか」で選ぶべき手法が変わります。
roundは手軽で便利ですが、Banker’s rounding が採用されているため、すべての用途に最適なわけではありません。
逆に、decimalやmath関数は明示的に挙動をコントロールでき、金融・統計・システム開発など幅広い場面で役立ちます。
最後に、目的別にぴったりの手法をまとめるので、迷ったときの指針として活用してください。
round関数を使うべきケース
roundは「手軽さ」「速度」「標準的な丸め」を求める場面で最適です。
統計処理やデータ分析のように、誤差が偏らないほうが望ましいケースでは特にメリットがあります。
Banker’s roundingはクセがありますが、平均化された誤差が必要な分析系ではむしろ好都合です。
nums = [1.5, 2.5, 3.5]
print([round(n) for n in nums]) # -> [2, 2, 4]
また、「小数点以下を揃えたい」「桁数だけ指定したい」ような軽い整形処理では、roundが最も簡単で効率的です。
decimalを使うべきケース
decimalは「丸めの正確性が最重要」な場面で必須です。
特に、請求書・給与計算・消費税など、ルールが厳密に決まっているケースでは、roundでは意図しない挙動が起きます。
decimalなら ROUND_HALF_UP を使って一般的な四捨五入を再現できます。
from decimal import Decimal, ROUND_HALF_UP
print(Decimal("2.5").quantize(Decimal("1"), rounding=ROUND_HALF_UP)) # -> 3
金融・会計処理をPythonで行うなら、「迷ったらdecimal」と覚えておけばまず間違いありません。
切り上げ・切り捨てを使うべきケース
math.floor()(切り捨て)と math.ceil()(切り上げ)は、「常に上」「常に下」へ丸めたい場面で最適です。
税金の端数処理、在庫数の計算、安全係数の算出など、ルールが固定されている処理には非常に便利です。
import math
print(math.floor(3.8)) # -> 3
print(math.ceil(3.2)) # -> 4
roundとは違い、曖昧さゼロの明確な丸めになるため「絶対に切り捨てる」「必ず切り上げる」と決まっている処理では、mathモジュールを使うことで安全で分かりやすいコードになります。