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 / count、sum(...)、あるいは float を生むあらゆる除算。 - サードパーティのデータ(pandas、API のレスポンス)が numpy/
float64の値を渡してくる。
修正方法
- 書き込む前に
decimal.Decimalに変換します:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - float ではなく
strからDecimalを作ります —Decimal(30.51)は2進浮動小数点数の誤差(30.510000000000001...)を引き継ぎます。Decimal(str(30.51))ならちょうど30.51になります。 - ネストしたデータは 再帰的に変換します —
put_itemの前に dict/list を走査して、すべての float をDecimal(str(x))にします。よくあるパターンはjson.loads(json.dumps(obj), parse_float=Decimal)です。 - 読み戻すとき、数値属性は
Decimalとして返ってきます。ネイティブ型が必要なら、アプリの境界でfloat/intに変換してください。 - 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 のハンドラでは捕まえられません。
関連するエラー
- Number overflow — DynamoDB の38桁の大きさの範囲を超えた値。
- SerializationException — 数値/文字列のワイヤ型の不一致。
- Learn: DynamoDB data types
参考資料
- Supported data types and naming rules in Amazon DynamoDB — Developer Guide
- boto3/dynamodb/types.py — boto3 source (TypeSerializer)
- Amazon DynamoDB — AWS SDK for Python (Boto3) guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-26 に boto3 1.43.56 / botocore 1.43.56 で再現しました — 上記の出力はそのままの逐語です。