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 Preis 30.51, ein berechneter Durchschnitt, ein json.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-Ergebnissetotal / 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

  1. Konvertiere vor dem Schreiben zu decimal.Decimal:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. Baue das Decimal aus einem str, nicht aus dem FloatDecimal(30.51) erbt den Binär-Float-Fehler (30.510000000000001...); Decimal(str(30.51)) gibt dir exakt 30.51.
  3. Konvertiere rekursiv für verschachtelte Daten — laufe das Dict/die List ab und verwandle jeden Float vor put_item in Decimal(str(x)). Ein gängiges Muster ist json.loads(json.dumps(obj), parse_float=Decimal).
  4. Beim Zurücklesen kommen Zahlenattribute als Decimal heraus; konvertiere am Rand deiner App zu float/int, wenn du native Typen brauchst.
  5. 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

Referenzen

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.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.