Float types are not supported. Use Decimal types instead.
TL;DR — O boto3 lançou um TypeError do Python porque você passou um float para o DynamoDB. O DynamoDB armazena números como decimais de precisão arbitrária (até 38 dígitos), e floats binários não conseguem representá-los exatamente — então o boto3 os recusa. Converta para decimal.Decimal antes de escrever, idealmente via str() para não herdar o arredondamento do float.
O que significa
TypeError: Float types are not supported. Use Decimal types instead.Este é um erro do lado do cliente lançado pelo boto3 (o AWS SDK para Python), não uma resposta do serviço DynamoDB — o serializador do SDK rejeita float antes de a requisição sequer ser enviada. O tipo N do DynamoDB guarda um número decimal com até 38 dígitos de precisão; o float do Python é IEEE-754 binário, que não consegue fazer round-trip desses valores sem perda. O boto3 falha alto em vez de armazenar silenciosamente uma aproximação.
Por que isso acontece
- Escrever um
floatcru — um preço30.51, uma média computada, um resultado dejson.loads()(números JSON com decimais viram floats do Python). - Floats aninhados — um float enterrado dentro de um dict/list que você está colocando; o boto3 percorre toda a estrutura e rejeita o primeiro.
- Resultados de aritmética —
total / count,sum(...), ou qualquer divisão que produz um float. - Dados de terceiros (pandas, uma resposta de API) que te entregam valores numpy/
float64.
Como corrigir
- Converta para
decimal.Decimalantes de escrever:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - Construa o
Decimala partir de umastr, não do float —Decimal(30.51)herda o erro de float binário (30.510000000000001...);Decimal(str(30.51))te dá exatamente30.51. - Converta recursivamente para dados aninhados — percorra o dict/list e transforme todo float em
Decimal(str(x))antes doput_item. Um padrão comum éjson.loads(json.dumps(obj), parse_float=Decimal). - Ao ler de volta, atributos numéricos saem como
Decimal; converta parafloat/intna borda do seu app se você precisar de tipos nativos. - Para valores além de 38 dígitos de precisão (IDs, inteiros enormes), armazene-os como strings em vez de números — veja number overflow.
FAQ
Por que o DynamoDB não aceita floats do Python? Números do DynamoDB são decimais de precisão arbitrária (até 38 dígitos). O float do Python é IEEE-754 binário e não consegue representar a maioria dos decimais exatamente, então o boto3 se recusa a armazenar uma aproximação com perda e lança "Float types are not supported. Use Decimal types instead."
Como converto um float para Decimal corretamente para o DynamoDB? Construa o Decimal a partir da forma de string: Decimal(str(value)), não Decimal(value). Decimal(30.51) carrega o erro de arredondamento binário do float, enquanto Decimal(str(30.51)) é exatamente 30.51. Para estruturas aninhadas, use json.loads(json.dumps(obj), parse_float=Decimal).
Reproduza
A rejeição acontece no serializador do boto3, antes de qualquer coisa ser enviada:
from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)Saída real:
TypeError: Float types are not supported. Use Decimal types instead.Repare na classe: este é um TypeError simples do boto3, não um erro do serviço DynamoDB. Nada chegou à AWS, então não há status HTTP, nem capacidade consumida, nem requisição para repetir — e um handler except ClientError não vai capturá-lo.
Erros relacionados
- Number overflow — um valor além do intervalo de magnitude de 38 dígitos do DynamoDB.
- SerializationException — uma incompatibilidade de wire-type número/string.
- Aprenda: DynamoDB data types
Referências
- 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
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.
Reproduzido em 2026-07-26 com boto3 1.43.56 / botocore 1.43.56 — a saída acima é literal.