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
floatmentah — harga30.51, rata-rata hasil hitungan, hasiljson.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 aritmetika —
total / count,sum(...), atau pembagian apa pun yang menghasilkan float. - Data pihak ketiga (pandas, sebuah respons API) yang menyodorkan nilai numpy/
float64.
Bagaimana cara memperbaikinya
- Konversikan ke
decimal.Decimalsebelum menulis:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - Bangun
Decimaldari sebuahstr, bukan dari float-nya —Decimal(30.51)mewarisi galat float biner (30.510000000000001...);Decimal(str(30.51))memberi Anda tepat30.51. - Konversikan secara rekursif untuk data bersarang — telusuri dict/list dan ubah setiap float menjadi
Decimal(str(x))sebelumput_item. Pola yang umum adalahjson.loads(json.dumps(obj), parse_float=Decimal). - Saat dibaca kembali, atribut angka keluar sebagai
Decimal; konversikan kefloat/intdi tepi aplikasi Anda kalau butuh tipe native. - 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
- Number overflow — nilai di luar rentang magnitudo 38 digit DynamoDB.
- SerializationException — ketidakcocokan tipe wire angka/string.
- Pelajari: Tipe data DynamoDB
Referensi
- 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
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.