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 float brut — un prix 30.51, une moyenne calculée, un résultat de json.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étiquestotal / 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

  1. Convertis en decimal.Decimal avant d'écrire :
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. Construis le Decimal à partir d'une str, pas du floatDecimal(30.51) hérite de l'erreur du float binaire (30.510000000000001...) ; Decimal(str(30.51)) te donne exactement 30.51.
  3. Convertis récursivement pour les données imbriquées — parcours le dict/list et transforme chaque float en Decimal(str(x)) avant put_item. Un motif courant est json.loads(json.dumps(obj), parse_float=Decimal).
  4. À la lecture, les attributs numériques ressortent en Decimal ; convertis-les en float/int à la frontière de ton application si tu as besoin de types natifs.
  5. 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

Références

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.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.