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
floatgrezzo — un prezzo30.51, una media calcolata, un risultato dijson.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 aritmetiche —
total / 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
- Converti in
decimal.Decimalprima di scrivere:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - Costruisci il
Decimalda unastr, non dal float —Decimal(30.51)eredita l'errore del float binario (30.510000000000001...);Decimal(str(30.51))ti dà esattamente30.51. - Converti ricorsivamente per i dati nidificati — percorri il dict/list e trasforma ogni float in
Decimal(str(x))prima diput_item. Un pattern comune èjson.loads(json.dumps(obj), parse_float=Decimal). - In lettura, gli attributi numerici escono come
Decimal; convertili infloat/intal bordo della tua applicazione se ti servono tipi nativi. - 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
- Number overflow — un valore oltre l'intervallo di grandezza a 38 cifre di DynamoDB.
- SerializationException — un disallineamento del tipo wire numero/stringa.
- Impara: DynamoDB data types
Riferimenti
- 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
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.