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 / 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. str 而不是從 float 建立 DecimalDecimal(30.51) 會繼承二進位浮點誤差(30.510000000000001...);Decimal(str(30.51)) 給你的正好是 30.51
  3. 對巢狀資料遞迴轉換 — 走遍 dict/list,在 put_item 之前把每個 float 都變成 Decimal(str(x))。常見的做法是 json.loads(json.dumps(obj), parse_float=Decimal)
  4. 讀回來時,數字屬性會以 Decimal 形式出現;如果你需要原生型別,就在應用程式的邊界處轉成 floatint
  5. 對超過 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 處理器捕捉不到它。

相關錯誤

參考資料

最後於 2026-07-13 對照上方連結的官方 AWS 文件驗證。

已於 2026-07-26 對照 boto3 1.43.56/botocore 1.43.56 重現 — 上方輸出為逐字原文。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。