Float types are not supported. Use Decimal types instead.
TL;DR — boto3 hat einen Python-TypeError ausgelöst, weil du einen float an DynamoDB übergeben hast. DynamoDB speichert Zahlen als Dezimalzahlen beliebiger Präzision (bis zu 38 Stellen), und binäre Floats können diese nicht exakt darstellen — also weist boto3 sie zurück. Konvertiere vor dem Schreiben zu decimal.Decimal, idealerweise via str(), damit du das Rundungsproblem des Floats nicht erbst.
Was es bedeutet
TypeError: Float types are not supported. Use Decimal types instead.Dies ist ein clientseitiger Fehler, ausgelöst von boto3 (dem AWS SDK für Python), keine DynamoDB-Service-Antwort — der Serializer des SDK weist float zurück, bevor die Anfrage überhaupt gesendet wird. DynamoDBs N-Typ hält eine Dezimalzahl mit bis zu 38 Stellen Präzision; Python-float ist IEEE-754-binär, was diese Werte nicht verlustfrei hin- und zurückwandeln kann. boto3 schlägt laut fehl, statt stillschweigend eine Näherung zu speichern.
Warum es passiert
- Schreiben eines rohen
float— ein Preis30.51, ein berechneter Durchschnitt, einjson.loads()-Ergebnis (JSON-Zahlen mit Dezimalstellen werden zu Python-Floats). - Verschachtelte Floats — ein Float tief in einem Dict/einer List, das/die du speicherst; boto3 läuft die ganze Struktur ab und weist den ersten zurück.
- Arithmetik-Ergebnisse —
total / count,sum(...)oder jede Division, die einen Float ergibt. - Drittanbieter-Daten (pandas, eine API-Antwort), die dir numpy-/
float64-Werte reichen.
So behebst du es
- Konvertiere vor dem Schreiben zu
decimal.Decimal:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - Baue das
Decimalaus einemstr, nicht aus dem Float —Decimal(30.51)erbt den Binär-Float-Fehler (30.510000000000001...);Decimal(str(30.51))gibt dir exakt30.51. - Konvertiere rekursiv für verschachtelte Daten — laufe das Dict/die List ab und verwandle jeden Float vor
put_iteminDecimal(str(x)). Ein gängiges Muster istjson.loads(json.dumps(obj), parse_float=Decimal). - Beim Zurücklesen kommen Zahlenattribute als
Decimalheraus; konvertiere am Rand deiner App zufloat/int, wenn du native Typen brauchst. - Für Werte jenseits von 38 Stellen Präzision (IDs, riesige Ganzzahlen) speichere sie stattdessen als Strings — siehe number overflow.
FAQ
Warum akzeptiert DynamoDB keine Python-Floats? DynamoDB-Zahlen sind Dezimalzahlen beliebiger Präzision (bis zu 38 Stellen). Python-Float ist IEEE-754-binär und kann die meisten Dezimalzahlen nicht exakt darstellen, also weigert sich boto3, eine verlustbehaftete Näherung zu speichern, und löst "Float types are not supported. Use Decimal types instead." aus.
Wie konvertiere ich einen Float korrekt für DynamoDB zu Decimal? Baue das Decimal aus der String-Form: Decimal(str(value)), nicht Decimal(value). Decimal(30.51) trägt den binären Rundungsfehler des Floats, während Decimal(str(30.51)) exakt 30.51 ist. Verwende für verschachtelte Strukturen json.loads(json.dumps(obj), parse_float=Decimal).
So reproduzierst du es
Die Zurückweisung passiert in boto3s Serializer, bevor irgendetwas gesendet wird:
from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)Echte Ausgabe:
TypeError: Float types are not supported. Use Decimal types instead.Achte auf die Klasse: Das ist ein schlichter TypeError von boto3, kein DynamoDB-Service-Fehler. Nichts hat AWS erreicht, es gibt also keinen HTTP-Status, keine verbrauchte Kapazität und keine Anfrage zum Wiederholen — und ein except ClientError-Handler fängt ihn nicht ab.
Verwandte Fehler
- Number overflow — ein Wert jenseits von DynamoDBs 38-stelligem Magnitudenbereich.
- SerializationException — ein Zahlen-/String-Wire-Typ-Mismatch.
- Learn: DynamoDB data types
Referenzen
- 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
Zuletzt verifiziert am 2026-07-13 gegen die offizielle, oben verlinkte AWS-Dokumentation.
Am 2026-07-26 gegen boto3 1.43.56 / botocore 1.43.56 reproduziert — die Ausgabe oben ist wortgetreu.