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 / 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."。
为 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 处理器捕获不到它。
相关错误
- Number overflow——超出 DynamoDB 38 位量级范围的值。
- SerializationException——数字/字符串的传输类型不匹配。
- 学习: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 复现——上方输出为原样照录。