Float types are not supported. Use Decimal types instead.
TL;DR — boto3 拋出了 Python TypeError,因為你把一個 float 傳給了 DynamoDB。DynamoDB 以任意精度的十進位數(最多 38 位數)儲存數字,而二進位浮點數無法精確表示這些值 — 所以 boto3 拒絕它們。寫入前先轉成 decimal.Decimal,最好透過 str(),這樣才不會繼承 float 的捨入誤差。
這是什麼意思
TypeError: Float types are not supported. Use Decimal types instead.這是由 boto3(AWS SDK for Python)拋出的用戶端錯誤,不是 DynamoDB 服務的回應 — SDK 的序列化器在請求送出之前就拒絕了 float。DynamoDB 的 N 型別存放的是精度最高 38 位數的十進位數;Python 的 float 是 IEEE-754 二進位,無法無損地來回轉換那些值。boto3 選擇大聲失敗,而不是靜默儲存一個近似值。
為什麼會發生
- 直接寫入原始
float— 一個價格30.51、一個算出來的平均值,或一個json.loads()的結果(帶小數的 JSON 數字會變成 Python float)。 - 巢狀的 float — 藏在你要寫入的 dict/list 裡的某個 float;boto3 會走遍整個結構並拒絕第一個。
- 算術結果 —
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')}) - 從
str而不是從 float 建立Decimal—Decimal(30.51)會繼承二進位浮點誤差(30.510000000000001...);Decimal(str(30.51))給你的正好是30.51。 - 對巢狀資料遞迴轉換 — 走遍 dict/list,在
put_item之前把每個 float 都變成Decimal(str(x))。常見的做法是json.loads(json.dumps(obj), parse_float=Decimal)。 - 讀回來時,數字屬性會以
Decimal形式出現;如果你需要原生型別,就在應用程式的邊界處轉成float/int。 - 對超過 38 位數精度的值(ID、超大整數),改用字串而非數字儲存 — 見數字溢位。
常見問題
DynamoDB 為什麼不接受 Python 的 float? DynamoDB 的數字是任意精度的十進位數(最多 38 位數)。Python 的 float 是 IEEE-754 二進位,無法精確表示多數十進位小數,所以 boto3 拒絕儲存有損的近似值,並拋出「Float types are not supported. Use Decimal types instead.」。
要怎麼正確地把 float 轉成給 DynamoDB 用的 Decimal? 從字串形式建立 Decimal:用 Decimal(str(value)),而不是 Decimal(value)。Decimal(30.51) 帶有 float 的二進位捨入誤差,而 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.注意這個類別:它是來自 boto3 的單純 TypeError,不是 DynamoDB 服務錯誤。沒有任何東西抵達 AWS,所以沒有 HTTP 狀態碼、沒有消耗容量、也沒有請求可重試 — 而且 except ClientError 處理器捕捉不到它。
相關錯誤
- 數字溢位 — 超出 DynamoDB 38 位數量級範圍的值。
- SerializationException — 數字/字串的傳輸型別不符。
- 學習:DynamoDB 資料型別
參考資料
- 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 重現 — 上方輸出為逐字原文。