用語比較
Decimalとfloatの違い|0.70×1.05が0.74と0.73に分かれる理由(Python3基礎)
round(.70 * 1.05, 2) は 0.73、round(Decimal('0.70') * Decimal('1.05'), 2) は Decimal('0.74') になります。見た目は同じ計算なのに、結果が1セント違います。
float は2進浮動小数、Decimal は10進浮動小数。10進数の値を正確に扱いたい場面(会計・等値テスト)は Decimalと覚えると、選択肢を切り分けられます。
このページは、Python公式チュートリアル11.8「10進浮動小数点演算」の記述と、Python 3.9.6での実行結果をもとに比べます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
float
組み込みの2進浮動小数。0.1のような10進数の値を、正確には表せないことがある。
Decimal
decimalモジュールの10進浮動小数。財務アプリケーションなど、正確な10進表記が必要な場面で便利。精度や丸めを制御できる。
見分け方
結果が Decimal('0.74') の形ならDecimal、0.73 の形ならfloat。Decimal(0.1) と Decimal('0.1') は別の値になる。
違いを表で確認
| 比較軸 | float | Decimal |
|---|---|---|
| 70セントに5%の税を加えた結果(小数点以下2桁に丸める) | float:round(.70 * 1.05, 2) は 0.73 | Decimal:round(Decimal('0.70') * Decimal('1.05'), 2) は Decimal('0.74') |
| 剰余の計算 | float:1.00 % 0.10 は 0.09999999999999995 | Decimal:Decimal('1.00') % Decimal('.10') は Decimal('0.00') |
| 0.1を10回足して1.0と比べる等値テスト | float:0.1 を10回足した結果 == 1.0 は False | Decimal:sum([Decimal('0.1')] * 10) == Decimal('1.0') は True |
| 使われる場面 | float:組み込みで、import なしに使える | Decimal:decimalモジュールを import して使う。財務アプリケーションや、法的・規制上の理由で値の丸めを制御したい場面で便利 |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
問題文に「会計処理」「正確な10進表記」とある人
公式チュートリアルは、財務アプリケーションやその他の正確な10進表記が必要なアプリケーションを、Decimalが便利な場面として挙げます。
0.1を10回足して1.0と比べると False になり、驚いた人
floatは2進浮動小数で、10進数の値を正確に表せないことがあります。Decimal('0.1') を10回足すと、1.0 と等しくなります。
Decimalに文字列で渡す理由が分からない人
Decimal(0.1) のようにfloatから作ると、公式ドキュメントのとおり、2進浮動小数の値が損失なくそのまま10進数に変換されます。Python 3.9.6で確かめると、Decimal(0.1) は 0.1000000000000000055511151231257827021181583404541015625 になりました。Decimal('0.1') なら Decimal('0.1') です。
具体例で使い分ける
例 1
70セントの電話代に5%の税を加える
公式チュートリアルの例を、Python 3.9.6で実行します。
- Decimal('0.70') * Decimal('1.05') は 0.7350 です。掛け合わせる数がどちらも小数点以下2桁なので、結果は4桁まで保持されます。
- 最も近いセント単位に丸めると、Decimalは Decimal('0.74')、floatは 0.73 になります。
結論: 手計算と同じ結果が欲しい場面は、Decimalです。
例 2
剰余で比べる
1.00 を 0.10 で割った余りを求める場面を考えます。
- floatでは、1.00 % 0.10 が 0.09999999999999995 になります。
- Decimalでは、Decimal('1.00') % Decimal('.10') が Decimal('0.00') です。
結論: 割り切れる計算が割り切れる結果になるのは、Decimalです。
例 3
選択肢で見分ける場合
「2進浮動小数では正確に表現できない10進数を、正確に表現できる」という文を、floatかDecimalかで判断します。
- 2進浮動小数では正確に表せない、と述べられているのは、floatの側の限界です。
- それを避けられるのは、10進浮動小数のDecimalです。
結論: 「10進数を正確に表現できる」とあれば、Decimalです。
問題文から答えを選ぶ手順
- 1
数値の種類を見る
decimalモジュールのDecimalは10進浮動小数、組み込みのfloatは2進浮動小数です。
- 2
場面を見る
財務アプリケーションなど、正確な10進表記が必要ならDecimalです。
- 3
結果の表示を見る
Decimal('0.74') の形ならDecimal、0.73 の形ならfloatです。
試験での見分け方
- 1floatは2進浮動小数で、10進数の値を正確に表せないことがある。
- 2Decimalは10進浮動小数で、精度や丸めを制御でき、等値テストも期待どおりに動く。
- 3Decimal(0.1) のようにfloatから作ると、floatの値がそのまま10進数に変換される。10進の値として渡すなら Decimal('0.1') のように文字列から作る。
誤答しやすい選択肢
Decimalもfloatと同じ2進浮動小数だと考える
修正: Decimalは10進浮動小数です。10進数の値を、そのまま表現できます。
Decimal(0.1) と Decimal('0.1') を同じものだと考える
修正: Decimal(0.1) は、floatの0.1が持つ2進の値をそのまま10進数にするため、0.1000000000000000055511151231257827021181583404541015625 になります。Python 3.9.6で Decimal(0.1) == Decimal('0.1') を確かめると False でした。
Decimalは import なしで使えると考える
修正: decimalモジュールから import します。floatは組み込みなので import は要りません。
確認問題
Q1round(Decimal('0.70') * Decimal('1.05'), 2) の結果は?
答え: Decimal('0.74')
10進浮動小数なので、手計算と同じ 0.7350 が丸められて 0.74 になります。floatの round(.70 * 1.05, 2) は 0.73 です。
Q2sum([Decimal('0.1')] * 10) == Decimal('1.0') の結果は?
答え: True
Decimalは厳密な値を表現できるので、等値テストが期待どおりになります。floatで同じことをすると False です。
Q3Decimal(0.1) == Decimal('0.1') の結果は?
答え: False
Decimal(0.1) は、floatの0.1が持つ2進の値をそのまま10進数にするため、Decimal('0.1') とは別の値になります。
到達チェック
- Decimalが10進浮動小数、floatが2進浮動小数だと言える
- 0.70×1.05を丸めた結果が、Decimalで0.74、floatで0.73だと言える
- Decimal(0.1) と Decimal('0.1') が別の値になる理由を言える
関連ページで確認する
同じ資格で次に知りたいこと
- try文のelse節とfinally節の違い|実行される条件と例外の扱い(Python3基礎)
try文のelse節とfinally節の違いを、Python公式チュートリアル8章の記述とPython 3.9.6の実行結果で整理。例外なしなら else→finally、例外ありなら except→finally になる流れと、else節の例外はexceptで捕捉されない点を、判断手順と確認問題つきで確認します。
- datetimeとtimedeltaの違い|日付同士の引き算が経過日数になる理由(Python3基礎)
datetimeとtimedeltaの違いを、Python公式チュートリアル10.8の記述とPython 3.9.6の実行結果で整理。日付を表すdate・datetimeと、日数・秒数の差を表すtimedeltaの区別、引き算と足し算の結果の型を、確認問題つきで確認します。
- rangeとlistの違い|リストに見えて実はリストではない(Python3基礎)
rangeとlistの違いを、Python公式チュートリアル4.3の記述(rangeはリストのように振る舞うが本当はリストではない)とPython 3.9.6の実行結果で整理。printの表示、要素の変更、list()で変える場面を切り分ける判断手順と確認問題つき。
よくある質問
QDecimalとfloatの違いは?
floatは組み込みの2進浮動小数、Decimalはdecimalモジュールの10進浮動小数です。公式チュートリアルは、Decimalが精度の制御や値丸めの制御、有効桁数の追跡が必要な場面で便利だと述べます。
QDecimalはどんな場面で便利ですか?
財務アプリケーションなど、正確な10進表記が必要な場面です。手計算の結果と同じ演算結果を期待するアプリケーションでも便利だと、公式チュートリアルは述べます。
Q0.1を10回足すと1.0になりますか?
floatでは 1.0 と等しくなく、比べた結果は False です。Decimal('0.1') を10回足すと Decimal('1.0') と等しく、比べた結果は True です。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
