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 float cru — um preço 30.51, uma média computada, um resultado de json.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éticatotal / 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

  1. Converta para decimal.Decimal antes de escrever:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. Construa o Decimal a partir de uma str, não do floatDecimal(30.51) herda o erro de float binário (30.510000000000001...); Decimal(str(30.51)) te dá exatamente 30.51.
  3. Converta recursivamente para dados aninhados — percorra o dict/list e transforme todo float em Decimal(str(x)) antes do put_item. Um padrão comum é json.loads(json.dumps(obj), parse_float=Decimal).
  4. Ao ler de volta, atributos numéricos saem como Decimal; converta para float/int na borda do seu app se você precisar de tipos nativos.
  5. 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

Referências

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.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.