Float types are not supported. Use Decimal types instead.

In breve — boto3 ha sollevato un TypeError Python perché hai passato un float a DynamoDB. DynamoDB memorizza i numeri come decimali a precisione arbitraria (fino a 38 cifre), e i float binari non possono rappresentarli esattamente — quindi boto3 li rifiuta. Converti in decimal.Decimal prima di scrivere, idealmente tramite str() così non erediti l'arrotondamento del float.

Cosa significa

TypeError: Float types are not supported. Use Decimal types instead.

Questo è un errore lato client sollevato da boto3 (l'AWS SDK per Python), non una risposta del servizio DynamoDB — il serializzatore dell'SDK rifiuta il float prima ancora che la richiesta venga inviata. Il tipo N di DynamoDB contiene un numero decimale con fino a 38 cifre di precisione; il float Python è IEEE-754 binario, che non può rappresentare quei valori senza perdita. boto3 fallisce in modo esplicito invece di memorizzare silenziosamente un'approssimazione.

Perché succede

  • Scrittura di un float grezzo — un prezzo 30.51, una media calcolata, un risultato di json.loads() (i numeri JSON con decimali diventano float Python).
  • Float nidificati — un float sepolto in un dict/list che stai inserendo; boto3 percorre l'intera struttura e rifiuta il primo che trova.
  • Risultati di operazioni aritmetichetotal / count, sum(...), o qualsiasi divisione che produce un float.
  • Dati di terze parti (pandas, una risposta API) che ti passano valori numpy/float64.

Come risolverlo

  1. Converti in decimal.Decimal prima di scrivere:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. Costruisci il Decimal da una str, non dal floatDecimal(30.51) eredita l'errore del float binario (30.510000000000001...); Decimal(str(30.51)) ti dà esattamente 30.51.
  3. Converti ricorsivamente per i dati nidificati — percorri il dict/list e trasforma ogni float in Decimal(str(x)) prima di put_item. Un pattern comune è json.loads(json.dumps(obj), parse_float=Decimal).
  4. In lettura, gli attributi numerici escono come Decimal; convertili in float/int al bordo della tua applicazione se ti servono tipi nativi.
  5. Per valori oltre le 38 cifre di precisione (ID, interi enormi), memorizzali come stringhe invece che come numeri — vedi number overflow.

FAQ

Perché DynamoDB non accetta i float Python? I numeri DynamoDB sono decimali a precisione arbitraria (fino a 38 cifre). Il float Python è IEEE-754 binario e non può rappresentare esattamente la maggior parte dei decimali, quindi boto3 si rifiuta di memorizzare un'approssimazione con perdita e solleva "Float types are not supported. Use Decimal types instead."

Come converto correttamente un float in Decimal per DynamoDB? Costruisci il Decimal dalla forma stringa: Decimal(str(value)), non Decimal(value). Decimal(30.51) porta con sé l'errore di arrotondamento binario del float, mentre Decimal(str(30.51)) è esattamente 30.51. Per le strutture nidificate, usa json.loads(json.dumps(obj), parse_float=Decimal).

Riproducilo

Il rifiuto avviene nel serializzatore di boto3, prima che venga inviato alcunché:

from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)

Output reale:

TypeError: Float types are not supported. Use Decimal types instead.

Nota la classe: questo è un semplice TypeError di boto3, non un errore del servizio DynamoDB. Nulla ha raggiunto AWS, quindi non c'è nessuno status HTTP, nessuna capacità consumata e nessuna richiesta da riprovare — e un handler except ClientError non lo intercetterà.

Errori correlati

Riferimenti

Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.

Riprodotto il 2026-07-26 su boto3 1.43.56 / botocore 1.43.56 — l'output qui sopra è riportato alla lettera.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.