Float types are not supported. Use Decimal types instead.
TL;DR — boto3 a levé une TypeError Python parce que tu as passé un float à DynamoDB. DynamoDB stocke les nombres comme des décimaux à précision arbitraire (jusqu'à 38 chiffres), et les floats binaires ne peuvent pas les représenter exactement — donc boto3 les refuse. Convertis en decimal.Decimal avant d'écrire, idéalement via str() pour ne pas hériter de l'arrondi du float.
Ce que ça signifie
TypeError: Float types are not supported. Use Decimal types instead.C'est une erreur côté client levée par boto3 (le SDK AWS pour Python), pas une réponse du service DynamoDB — le sérialiseur du SDK rejette le float avant même que la requête ne soit envoyée. Le type N de DynamoDB contient un nombre décimal avec jusqu'à 38 chiffres de précision ; le float Python est un binaire IEEE-754, qui ne peut pas restituer ces valeurs sans perte. boto3 échoue bruyamment plutôt que de stocker silencieusement une approximation.
Pourquoi ça arrive
- Écrire un
floatbrut — un prix30.51, une moyenne calculée, un résultat dejson.loads()(les nombres JSON avec décimales deviennent des floats Python). - Floats imbriqués — un float enfoui dans un dict/list que tu insères ; boto3 parcourt toute la structure et rejette le premier rencontré.
- Résultats d'opérations arithmétiques —
total / count,sum(...), ou toute division qui produit un float. - Données tierces (pandas, une réponse d'API) qui te donnent des valeurs numpy/
float64.
Comment le corriger
- Convertis en
decimal.Decimalavant d'écrire :from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - Construis le
Decimalà partir d'unestr, pas du float —Decimal(30.51)hérite de l'erreur du float binaire (30.510000000000001...) ;Decimal(str(30.51))te donne exactement30.51. - Convertis récursivement pour les données imbriquées — parcours le dict/list et transforme chaque float en
Decimal(str(x))avantput_item. Un motif courant estjson.loads(json.dumps(obj), parse_float=Decimal). - À la lecture, les attributs numériques ressortent en
Decimal; convertis-les enfloat/intà la frontière de ton application si tu as besoin de types natifs. - Pour des valeurs au-delà de 38 chiffres de précision (identifiants, très grands entiers), stocke-les en chaînes plutôt qu'en nombres — voir dépassement numérique.
FAQ
Pourquoi DynamoDB n'accepte-t-il pas les floats Python ? Les nombres DynamoDB sont des décimaux à précision arbitraire (jusqu'à 38 chiffres). Le float Python est un binaire IEEE-754 et ne peut pas représenter la plupart des décimaux exactement, donc boto3 refuse de stocker une approximation avec perte et lève « Float types are not supported. Use Decimal types instead. »
Comment convertir correctement un float en Decimal pour DynamoDB ? Construis le Decimal à partir de la forme chaîne : Decimal(str(value)), pas Decimal(value). Decimal(30.51) porte l'erreur d'arrondi binaire du float, tandis que Decimal(str(30.51)) vaut exactement 30.51. Pour les structures imbriquées, utilise json.loads(json.dumps(obj), parse_float=Decimal).
Reproduire l'erreur
Le refus se produit dans le sérialiseur de boto3, avant tout envoi :
from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)Sortie réelle :
TypeError: Float types are not supported. Use Decimal types instead.Note la classe : c'est un simple TypeError de boto3, pas une erreur du service DynamoDB. Rien n'a atteint AWS, donc aucun statut HTTP, aucune capacité consommée et rien à réessayer — et un handler except ClientError ne l'attrapera pas.
Erreurs liées
- Number overflow — une valeur au-delà de la plage de magnitude de 38 chiffres de DynamoDB.
- SerializationException — une incohérence de type filaire nombre/chaîne.
- Apprends : Types de données DynamoDB
Références
- 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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.
Reproduit le 2026-07-26 avec boto3 1.43.56 / botocore 1.43.56 — la sortie ci-dessus est reproduite telle quelle.