Float types are not supported. Use Decimal types instead.
TL;DR — boto3, DynamoDB'ye bir float geçirdiğiniz için bir Python TypeError fırlattı. DynamoDB sayıları keyfi hassasiyetli ondalıklar olarak saklar (38 basamağa kadar) ve ikili float'lar bunları tam olarak temsil edemez — bu yüzden boto3 onları reddeder. Yazmadan önce decimal.Decimal'e dönüştürün, ideal olarak str() aracılığıyla, böylece float'ın yuvarlamasını devralmazsınız.
Ne anlama gelir
TypeError: Float types are not supported. Use Decimal types instead.Bu, bir DynamoDB hizmet yanıtı değil, boto3 (Python için AWS SDK) tarafından fırlatılan istemci tarafı bir hatadır — SDK'nın serileştiricisi, istek gönderilmeden önce float'ı reddeder. DynamoDB'nin N türü, 38 basamağa kadar hassasiyetle bir ondalık sayı tutar; Python float, IEEE-754 ikilisidir ve bu değerleri kayıpsız gidip gelemez. boto3, sessizce bir yaklaşık değer saklamak yerine sesli başarısız olur.
Neden olur
- Çıplak bir
floatyazmak — bir fiyat30.51, hesaplanmış bir ortalama, birjson.loads()sonucu (ondalıklı JSON sayıları Python float olur). - Yuvalanmış float'lar — put ettiğiniz bir dict/list içine gömülü bir float; boto3 tüm yapıyı dolaşır ve ilkini reddeder.
- Aritmetik sonuçlar —
total / count,sum(...)ya da bir float veren herhangi bir bölme. - Size numpy/
float64değerleri veren üçüncü taraf verisi (pandas, bir API yanıtı).
Nasıl düzeltilir
- Yazmadan önce
decimal.Decimal'e dönüştürün:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) Decimal'i float'tan değil, birstr'den oluşturun —Decimal(30.51)ikili-float hatasını devralır (30.510000000000001...);Decimal(str(30.51))size tam olarak30.51verir.- Yuvalanmış veri için özyinelemeli olarak dönüştürün — dict/list'i dolaşın ve
put_item'dan önce her float'ıDecimal(str(x))'e çevirin. Yaygın bir desenjson.loads(json.dumps(obj), parse_float=Decimal)'dir. - Geri okurken, sayı öznitelikleri
Decimalolarak çıkar; yerel türlere ihtiyacınız varsa uygulamanızın kenarındafloat/int'e dönüştürün. - 38 basamak hassasiyetin ötesindeki değerler (ID'ler, devasa tam sayılar) için, onları sayı yerine string olarak saklayın — number overflow'a bakın.
SSS
DynamoDB neden Python float'larını kabul etmiyor? DynamoDB sayıları keyfi hassasiyetli ondalıklardır (38 basamağa kadar). Python float, IEEE-754 ikilisidir ve çoğu ondalığı tam olarak temsil edemez, bu yüzden boto3 kayıplı bir yaklaşık değeri saklamayı reddeder ve "Float types are not supported. Use Decimal types instead." fırlatır.
DynamoDB için bir float'ı Decimal'e nasıl doğru dönüştürürüm?
Decimal'i string biçiminden oluşturun: Decimal(value) değil, Decimal(str(value)). Decimal(30.51) float'ın ikili yuvarlama hatasını taşır, Decimal(str(30.51)) ise tam olarak 30.51'dir. Yuvalanmış yapılar için json.loads(json.dumps(obj), parse_float=Decimal) kullanın.
Nasıl yeniden oluşturulur
Ret, herhangi bir şey gönderilmeden önce boto3'ün serileştiricisinde gerçekleşir:
from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)Gerçek çıktı:
TypeError: Float types are not supported. Use Decimal types instead.Sınıfa dikkat edin: bu, bir DynamoDB hizmet hatası değil, boto3'ten gelen düz bir TypeError'dır. AWS'ye hiçbir şey ulaşmadı; dolayısıyla ne bir HTTP durumu, ne tüketilen kapasite, ne de yeniden denenecek bir istek var — ve bir except ClientError işleyicisi onu yakalamaz.
İlgili hatalar
- Number overflow — DynamoDB'nin 38 basamaklı büyüklük aralığının ötesinde bir değer.
- SerializationException — bir sayı/string kablo türü uyuşmazlığı.
- Öğrenin: DynamoDB data types
Kaynaklar
- 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.
2026-07-26 tarihinde boto3 1.43.56 / botocore 1.43.56 ile yeniden üretildi — yukarıdaki çıktı birebir alınmıştır.