Float types are not supported. Use Decimal types instead.

TL;DR — boto3 melempar TypeError Python karena Anda mengoper sebuah float ke DynamoDB. DynamoDB menyimpan angka sebagai desimal berpresisi arbitrer (hingga 38 digit), dan float biner tidak bisa merepresentasikannya secara eksak — jadi boto3 menolaknya. Konversikan ke decimal.Decimal sebelum menulis, sebaiknya lewat str() supaya Anda tidak mewarisi pembulatan si float.

Apa artinya

TypeError: Float types are not supported. Use Decimal types instead.

Ini error di sisi klien yang dilempar boto3 (AWS SDK for Python), bukan respons dari layanan DynamoDB — serializer SDK menolak float bahkan sebelum request dikirim. Tipe N DynamoDB menampung angka desimal dengan presisi sampai 38 digit; float Python adalah biner IEEE-754, yang tidak bisa membolak-balikkan nilai-nilai itu tanpa kehilangan. boto3 memilih gagal keras ketimbang diam-diam menyimpan aproksimasi.

Mengapa itu terjadi

  • Menulis float mentah — harga 30.51, rata-rata hasil hitungan, hasil json.loads() (angka JSON berdesimal menjadi float Python).
  • Float bersarang — sebuah float terkubur di dalam dict/list yang Anda put; boto3 menelusuri seluruh struktur dan menolak yang pertama ditemukan.
  • Hasil aritmetikatotal / count, sum(...), atau pembagian apa pun yang menghasilkan float.
  • Data pihak ketiga (pandas, sebuah respons API) yang menyodorkan nilai numpy/float64.

Bagaimana cara memperbaikinya

  1. Konversikan ke decimal.Decimal sebelum menulis:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. Bangun Decimal dari sebuah str, bukan dari float-nyaDecimal(30.51) mewarisi galat float biner (30.510000000000001...); Decimal(str(30.51)) memberi Anda tepat 30.51.
  3. Konversikan secara rekursif untuk data bersarang — telusuri dict/list dan ubah setiap float menjadi Decimal(str(x)) sebelum put_item. Pola yang umum adalah json.loads(json.dumps(obj), parse_float=Decimal).
  4. Saat dibaca kembali, atribut angka keluar sebagai Decimal; konversikan ke float/int di tepi aplikasi Anda kalau butuh tipe native.
  5. Untuk nilai melebihi presisi 38 digit (ID, integer raksasa), simpan sebagai string alih-alih angka — lihat number overflow.

FAQ

Mengapa DynamoDB tidak menerima float Python? Angka DynamoDB adalah desimal berpresisi arbitrer (hingga 38 digit). Float Python adalah biner IEEE-754 dan tidak bisa merepresentasikan sebagian besar desimal secara eksak, jadi boto3 menolak menyimpan aproksimasi yang lossy dan melempar "Float types are not supported. Use Decimal types instead."

Bagaimana cara mengonversi float ke Decimal dengan benar untuk DynamoDB? Bangun Decimal dari bentuk string-nya: Decimal(str(value)), bukan Decimal(value). Decimal(30.51) membawa galat pembulatan biner si float, sedangkan Decimal(str(30.51)) tepat 30.51. Untuk struktur bersarang, pakai json.loads(json.dumps(obj), parse_float=Decimal).

Cara mereproduksinya

Penolakan terjadi di serializer boto3, sebelum apa pun terkirim:

from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)

Keluaran sebenarnya:

TypeError: Float types are not supported. Use Decimal types instead.

Perhatikan kelasnya: ini TypeError biasa dari boto3, bukan error layanan DynamoDB. Tidak ada apa pun yang sampai ke AWS, jadi tidak ada status HTTP, tidak ada kapasitas terpakai, dan tidak ada request untuk dicoba ulang — dan handler except ClientError tidak akan menangkapnya.

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Direproduksi 2026-07-26 terhadap boto3 1.43.56 / botocore 1.43.56 — keluaran di atas dikutip apa adanya.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.