1. はじめに|Pythonで小数の計算がおかしい?
Pythonで「0.1 + 0.2」を計算してみたら、「あれ?0.3にならない!?」ってビックリしたこと、ありませんか?
print(0.1 + 0.2)
# 出力: 0.30000000000000004
えっ、どうして!?って思いますよね。ふつう、0.1と0.2を足したら、0.3になるはずなのに…。
実はこれ、Pythonが悪いわけじゃないんです。パソコンの中で小数をどうやって扱っているか、という「仕組みの問題」なんです。
パソコンは「2進数」で計算をしています。でも、小数の一部は2進数ではキレイに表せないものもあります。たとえば10進数の「0.1」もそのひとつ。これが、ちょっとしたズレ=誤差を生んでしまうんですね。
この誤差、ふだんの計算では気づかないかもしれません。でも、お金の計算や、精度が大事な場面ではとっても困ります…。
そこで登場するのが Decimal(デシマル)モジュールです!
このモジュールを使うと、Pythonでも正確な小数の計算ができるようになるんです!
この記事では、「Decimalってなに?」「どうやって使うの?」「floatと何がちがうの?」という疑問に答えながら、Python初心者でもバッチリ理解できるようにやさしく解説していきます!
2. float型の誤差の正体とは?
Pythonでは、小数を扱うときに「float(フロート)型」というデータ型を使います。これは、「浮動小数点数」とも呼ばれていて、コンピュータにとってはとても便利な仕組みです。
でも…このfloat型、完璧ではありません。実は、ちょっとした落とし穴があるんです。
🧠 小数はコンピュータが苦手?
コンピュータは「2進数(0と1)」で計算をしています。でも、私たちがふだん使っている「10進数」の小数は、2進数ではうまく表せないものがたくさんあります。
たとえば、「0.1」は2進数で正確に表すことができません。そのため、**ほんのわずかなズレ(誤差)**が生まれてしまいます。
試しにこんなコードを書いてみましょう:
print(0.1 + 0.2)
出力はなんと…
コピーする編集する0.30000000000000004
あれ〜!? 0.3になってない!
これはバグではありません。float型の仕様による「しょうがない誤差」なんです。
🧾 どんなときに問題になるの?
たとえば、次のような場面でfloatの誤差が問題になります:
- 💰 お金の計算(会計や料金):1円の誤差でも大きなトラブルに。
- ⚖ 重さや距離の測定:小さな誤差が大きなズレにつながることも。
- 🔬 科学や工学の計算:精密さが命!

こうしたシーンでは、「Decimal」のような誤差が出にくい方法で小数を扱うのがとても大切です。
3. Decimalモジュールとは?
Pythonで小数の誤差をなくしたいなら…
ズバリ、「decimalモジュール」を使いましょう!
このモジュールを使えば、float型のような「誤差のある計算」ではなく、正確な小数計算ができるようになります!
🧩 Decimalとは何者?
decimalは、Pythonにもともと入っている標準ライブラリのひとつです。その中にある「Decimalクラス」を使うことで、誤差の少ない小数を扱えるようになります。
floatとの最大の違いは、「10進数ベースで正確に小数を扱える」こと!
たとえば、あの有名な 0.1 + 0.2 も、Decimalを使えば…
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 出力: 0.3
ちゃんと「0.3」になります!これなら安心ですね😊
🧪 なぜ文字列で渡すの?
「Decimal(0.1)じゃダメなの?」と思った方、ナイス疑問です!
実は Decimal(0.1) と書くと、すでに誤差のあるfloat値0.1 をDecimalに変換してしまうため、意味がなくなります。
print(Decimal(0.1)) # 出力: 0.100000000000000005551115...
このように誤差が入ってしまうので、必ず文字列(’0.1’)で渡すのがポイントです!
✅ Decimalの使い方まとめ
decimalモジュールをインポートするDecimal('小数')のように文字列で小数を渡す- floatの代わりにDecimal同士で計算する
from decimal import Decimal
x = Decimal('1.5')
y = Decimal('2.3')
print(x * y) # 出力: 3.45
4. floatとDecimalの違いを比較してみよう
ここまで読んできて、「Decimalが正確なのはわかったけど、floatと何がそんなに違うの?」と思った方もいるかもしれません。
この章では、floatとDecimalの違いを実際のコードで見比べながら、どんなときにどちらを使うべきかをやさしく解説していきます!
🔍 実験:floatとDecimalの出力を比べてみよう
まずはおなじみの「0.1 + 0.2」で比較してみましょう。
# floatの場合
print(0.1 + 0.2) # 結果: 0.30000000000000004
# Decimalの場合
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # 結果: 0.3
floatでは「ほんのちょっとズレた」結果になってしまいましたが、Decimalではきれいに 0.3 と表示されていますね。
📊 float vs Decimal 比較表
| 項目 | float型 | Decimal型 |
|---|---|---|
| 精度 | 誤差あり | 高精度(誤差なし) |
| 速さ | とても速い | やや遅い |
| 表現方法 | 2進数ベース | 10進数ベース |
| おすすめ用途 | センサー値やざっくりした計算 | 金額計算、精密な測定 |
| 書き方 | 0.1 + 0.2 | Decimal('0.1') + Decimal('0.2') |
🧠 なぜfloatが使われ続けているの?
floatは、とにかく速い!
そして、多少の誤差があっても気にならない場面では、とっても便利なんです。たとえば:
- ゲームやグラフィックスの座標計算
- 機械学習や統計など、大量の計算処理
- ざっくりした数値の扱い
こういうときは、わざわざDecimalにする必要はありません。
💡 結論:使い分けが大事!
| こんなときは… | 使うべき型 |
|---|---|
| お金・料金の計算 | Decimal |
| 会計・請求処理 | Decimal |
| 少しの誤差もNGな場面 | Decimal |
| ゲームや物理演算 | float |
| とにかく速く処理したい | float |

「いつでもDecimalを使えばいい!」というわけではありません。シーンによって、floatとDecimalを使い分けるのがコツです😊
5. よく使うDecimalの操作一覧
Decimal(デシマル)を使えば、小数の計算を正確にできるようになりますが、実はもっと便利なこともできるんです!
この章では、丸め・精度の設定・基本的な演算など、よく使う操作を一覧で紹介します。お金の計算やレポート作成などでも活躍するので、ぜひ覚えておきましょう!
✂️ 小数点の丸め方(round)
お金の計算で「1円未満は四捨五入」したいときってありますよね?
Decimalでは .quantize() を使えば自由に丸めができます!
🔧 書き方:
from decimal import Decimal, ROUND_HALF_UP
x = Decimal('123.456')
# 小数第1位までで四捨五入
rounded = x.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
print(rounded) # 出力: 123.5
🧾 よく使う丸め方法
| 名前 | 内容 |
|---|---|
ROUND_HALF_UP | 四捨五入 |
ROUND_DOWN | 切り捨て |
ROUND_UP | 切り上げ |
ROUND_HALF_EVEN | 偶数丸め(会計用) |
🎯 計算精度の設定(コンテキスト)
Decimalは「精度(何桁まで計算するか)」も自由に設定できます。
from decimal import getcontext
getcontext().prec = 5 # 小数5桁まで計算
ただし、これは演算の途中での精度を制限するためのもので、見た目の桁数とはちょっと違うので注意です!
➕➖✖️➗ 四則演算
Decimal同士なら、ふつうの計算(+、-、*、/)がそのままできます!
a = Decimal('1.2')
b = Decimal('3.4')
print(a + b) # 足し算 → 4.6
print(a - b) # 引き算 → -2.2
print(a * b) # 掛け算 → 4.08
print(a / b) # 割り算 → 0.352941...
ポイントは「Decimal同士で計算する」こと。
floatと混ぜて使うのはNG⚠️です!
💬 まとめ:使いこなせば最強の小数ツール!
| 機能 | 使い方の例 |
|---|---|
| 丸め | .quantize(Decimal('0.1'), ROUND_HALF_UP) |
| 精度設定 | getcontext().prec = 5 |
| 四則演算 | + - * / はそのまま使える |

ちょっとしたお金の計算や、帳票(レポート)作成でも大活躍!
6. 実践:Decimalを使ったお金の計算サンプル
ここでは、実際に「Decimal」を使って、お金の計算をしてみましょう!
テーマはずばり…
**「消費税を含めた合計金額を求める」**です!
💰 シナリオ:税込価格を求めたい!
たとえば、あなたが1,980円の商品を買ったとしましょう。
消費税が10%かかるので、支払う金額は「1,980円 + 税」です。
これをDecimalで計算すると、こうなります:
from decimal import Decimal, ROUND_HALF_UP
# 金額と税率をDecimalで定義(文字列で!)
price = Decimal('1980')
tax_rate = Decimal('0.10')
# 税込み価格を計算
total = price * (Decimal('1.0') + tax_rate)
# 小数点以下を四捨五入(整数に丸める)
total = total.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(f"税込価格: {total}円")
✅ 出力結果
税込価格: 2178円
ちゃんと10%の税が加算されて、正確に「2,178円」になりました!
💡 なにが良いの?
このようなお金の計算では、小数点以下の誤差がトラブルのもと。
たとえば1円のズレでも、たくさんの取引があると大きな金額になりますよね。
Decimalを使えば:
- 誤差のない計算ができる!
- 四捨五入や切り捨てが自由にできる!
- 金額の表示がスッキリきれい!
と、いいことづくめなんです 😊
7. まとめ|精度が必要ならDecimalを使おう!
この記事では、Pythonでありがちな「小数の誤差」について、原因から対策までやさしく解説してきました。
🔁 おさらい!
- Pythonの
float型は、2進数で小数を表すためほんの少しの誤差が起きてしまう - 小数の誤差は、お金や正確さが求められる場面で大問題になることがある
- そんなときは、
decimalモジュールのDecimal型を使えば誤差なく小数を扱える!
🧠 これからのポイント!
- 小数を扱うときは、誤差が許されるかどうかをよく考えよう
- お金や計測データなど、正確さが命のときは必ずDecimalを使おう!
- Decimalを使うときは文字列から変換するのが鉄則!

「なんかPythonって小数計算がおかしいかも…?」と感じたら、それはあなたがプログラミングに慣れてきた証拠です!
そんなときこそ、「Decimal」という便利なツールを思い出してくださいね😊
よくある質問(Q&A)
- Q
Decimal(0.1)ではなく、なぜDecimal('0.1')を使うの? - A
0.1はすでに float 型として誤差を含んでいるためです。Decimal(0.1)にすると、その誤差がそのまま持ち込まれてしまいます。正確な小数として扱いたい場合は、文字列'0.1'を渡すのが安全です。
- QDecimalを使うとプログラムが遅くなるって本当?
- A
はい、本当です。floatよりも計算が遅くなります。でも、人間に見せる値(お金など)の計算ではスピードより正確さが大事なので、場面に応じて使い分けましょう!
- QfloatとDecimalは一緒に使ってもいいの?
- A
原則としてNGです。floatとDecimalを混ぜて計算すると、予期せぬ誤差やエラーの原因になります。計算はDecimal同士で統一しましょう。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。