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——float 藏在你要写入的 dict/list 深处;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 来构造 Decimal——Decimal(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 的形式出现;如果你需要原生类型,在应用边界处再转成 float/int
  5. 对于超过 38 位精度的值(ID、超大整数),改用字符串存储而不是数字——参见数字溢出

常见问题

DynamoDB 为什么不接受 Python 的 float? DynamoDB 的数字是任意精度十进制数(最多 38 位)。Python 的 float 是 IEEE-754 二进制浮点,无法精确表示大多数十进制小数,因此 boto3 拒绝存储一个有损的近似值,并抛出 "Float types are not supported. Use Decimal types instead."。

为 DynamoDB 把 float 正确转换成 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 agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。