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 float yazmak — bir fiyat 30.51, hesaplanmış bir ortalama, bir json.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çlartotal / count, sum(...) ya da bir float veren herhangi bir bölme.
  • Size numpy/float64 değerleri veren üçüncü taraf verisi (pandas, bir API yanıtı).

Nasıl düzeltilir

  1. 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')})
  2. Decimal'i float'tan değil, bir str'den oluşturunDecimal(30.51) ikili-float hatasını devralır (30.510000000000001...); Decimal(str(30.51)) size tam olarak 30.51 verir.
  3. 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 desen json.loads(json.dumps(obj), parse_float=Decimal)'dir.
  4. Geri okurken, sayı öznitelikleri Decimal olarak çıkar; yerel türlere ihtiyacınız varsa uygulamanızın kenarında float/int'e dönüştürün.
  5. 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

Kaynaklar

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.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.