Float types are not supported. Use Decimal types instead.

TL;DR — DynamoDB に float を渡したため、boto3 が Python の TypeError を発生させました。DynamoDB は数値を任意精度の10進数(最大38桁)として保存し、2進浮動小数点数はそれらを正確に表現できません — なので boto3 は受け付けません。書き込む前に decimal.Decimal に変換してください。float の丸め誤差を引き継がないよう、できれば str() 経由で。

意味

TypeError: Float types are not supported. Use Decimal types instead.

これは DynamoDB サービスのレスポンスではなく、boto3(AWS SDK for Python)が発生させる クライアント側 のエラーです — SDK のシリアライザが、リクエストが送られる前に float を拒否します。DynamoDB の N 型は最大38桁の精度を持つ10進数を保持しますが、Python の float は IEEE-754 の2進表現であり、それらの値をロスレスで往復させられません。boto3 は近似値を黙って保存するのではなく、大きな声で失敗します。

発生する理由

  • 生の float の書き込み — 価格 30.51、計算した平均、json.loads() の結果(小数を含む JSON の数値は Python の float になります)。
  • ネストした float — put しようとしている dict/list の奥に埋もれた float。boto3 は構造全体を走査し、最初の1つで拒否します。
  • 算術の結果total / countsum(...)、あるいは float を生むあらゆる除算。
  • サードパーティのデータ(pandas、API のレスポンス)が numpy/float64 の値を渡してくる。

修正方法

  1. 書き込む前に decimal.Decimal に変換します:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. float ではなく str から Decimal を作りますDecimal(30.51) は2進浮動小数点数の誤差(30.510000000000001...)を引き継ぎます。Decimal(str(30.51)) ならちょうど 30.51 になります。
  3. ネストしたデータは 再帰的に変換しますput_item の前に dict/list を走査して、すべての float を Decimal(str(x)) にします。よくあるパターンは json.loads(json.dumps(obj), parse_float=Decimal) です。
  4. 読み戻すとき、数値属性は Decimal として返ってきます。ネイティブ型が必要なら、アプリの境界で float/int に変換してください。
  5. 38桁の精度を超える値(ID、巨大な整数)は、数値ではなく 文字列 として保存します — number overflow を参照してください。

よくある質問

なぜ DynamoDB は Python の float を受け付けないのですか? DynamoDB の数値は任意精度の10進数(最大38桁)です。Python の float は IEEE-754 の2進表現で、ほとんどの10進数を正確に表現できません。そのため boto3 は損失のある近似値の保存を拒み、「Float types are not supported. Use Decimal types instead.」を発生させます。

DynamoDB 向けに float を正しく Decimal に変換するには? 文字列形式から Decimal を作ります。Decimal(value) ではなく Decimal(str(value)) です。Decimal(30.51) は float の2進丸め誤差を持ち込みますが、Decimal(str(30.51)) はちょうど 30.51 です。ネストした構造には json.loads(json.dumps(obj), parse_float=Decimal) を使ってください。

再現方法

拒否は、何かが送信される前に boto3 のシリアライザで起こります。

from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)

実際の出力:

TypeError: Float types are not supported. Use Decimal types instead.

クラスに注目してください。これは DynamoDB サービスのエラーではなく、boto3 が投げるただの TypeError です。AWS には何も到達していないので、HTTP ステータスも、消費キャパシティも、リトライすべきリクエストもありません — そして except ClientError のハンドラでは捕まえられません。

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

2026-07-26 に boto3 1.43.56 / botocore 1.43.56 で再現しました — 上記の出力はそのままの逐語です。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。