AI資格ドリル
資格を選ぶ↓

用語比較

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') は別の値になる。

違いを表で確認

比較軸floatDecimal
70セントに5%の税を加えた結果(小数点以下2桁に丸める)float:round(.70 * 1.05, 2) は 0.73Decimal:round(Decimal('0.70') * Decimal('1.05'), 2) は Decimal('0.74')
剰余の計算float:1.00 % 0.10 は 0.09999999999999995Decimal:Decimal('1.00') % Decimal('.10') は Decimal('0.00')
0.1を10回足して1.0と比べる等値テストfloat:0.1 を10回足した結果 == 1.0 は FalseDecimal:sum([Decimal('0.1')] * 10) == Decimal('1.0') は True
使われる場面float:組み込みで、import なしに使えるDecimal:decimalモジュールを import して使う。財務アプリケーションや、法的・規制上の理由で値の丸めを制御したい場面で便利

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

問題文に「会計処理」「正確な10進表記」とある人

公式チュートリアルは、財務アプリケーションやその他の正確な10進表記が必要なアプリケーションを、Decimalが便利な場面として挙げます。

02

0.1を10回足して1.0と比べると False になり、驚いた人

floatは2進浮動小数で、10進数の値を正確に表せないことがあります。Decimal('0.1') を10回足すと、1.0 と等しくなります。

03

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. 1

    数値の種類を見る

    decimalモジュールのDecimalは10進浮動小数、組み込みのfloatは2進浮動小数です。

  2. 2

    場面を見る

    財務アプリケーションなど、正確な10進表記が必要ならDecimalです。

  3. 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') が別の値になる理由を言える

同じ資格で次に知りたいこと

よくある質問

QDecimalとfloatの違いは?

A

floatは組み込みの2進浮動小数、Decimalはdecimalモジュールの10進浮動小数です。公式チュートリアルは、Decimalが精度の制御や値丸めの制御、有効桁数の追跡が必要な場面で便利だと述べます。

QDecimalはどんな場面で便利ですか?

A

財務アプリケーションなど、正確な10進表記が必要な場面です。手計算の結果と同じ演算結果を期待するアプリケーションでも便利だと、公式チュートリアルは述べます。

Q0.1を10回足すと1.0になりますか?

A

floatでは 1.0 と等しくなく、比べた結果は False です。Decimal('0.1') を10回足すと Decimal('1.0') と等しく、比べた結果は True です。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)