Float types are not supported. Use Decimal types instead.
요약 — DynamoDB에 float를 전달했기 때문에 boto3가 Python TypeError를 발생시켰습니다. DynamoDB는 숫자를 임의 정밀도 십진수(최대 38자리)로 저장하는데, 이진 부동소수점은 그 값을 정확히 표현할 수 없습니다 — 그래서 boto3가 거부합니다. 쓰기 전에 decimal.Decimal로 변환하되, float의 반올림 오차를 물려받지 않도록 가급적 str()을 거치세요.
무엇을 의미하는가
TypeError: Float types are not supported. Use Decimal types instead.이것은 DynamoDB 서비스 응답이 아니라 boto3(AWS SDK for Python)가 발생시키는 클라이언트 측 오류입니다 — SDK의 직렬화기가 요청을 보내기도 전에 float를 거부합니다. DynamoDB의 N 타입은 최대 38자리 정밀도의 십진수를 담습니다. Python float는 IEEE-754 이진 형식이라 그런 값을 손실 없이 왕복시킬 수 없습니다. boto3는 근삿값을 조용히 저장하는 대신 명시적으로 실패합니다.
왜 발생하는가
- 원시
float를 쓰는 경우 — 가격30.51, 계산된 평균,json.loads()결과(소수점이 있는 JSON 숫자는 Python float가 됩니다). - 중첩된 float — 저장하려는 dict/list 안에 파묻힌 float. boto3는 구조 전체를 순회하며 처음 만난 것을 거부합니다.
- 산술 결과 —
total / count,sum(...), 또는 float를 내는 모든 나눗셈. - numpy/
float64값을 넘겨주는 서드파티 데이터(pandas, API 응답).
어떻게 해결하는가
- 쓰기 전에
decimal.Decimal로 변환하세요:from decimal import Decimal table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')}) - float이 아니라
str에서Decimal을 만드세요 —Decimal(30.51)은 이진 부동소수점 오차를 물려받지만(30.510000000000001...),Decimal(str(30.51))은 정확히30.51이 됩니다. - 중첩된 데이터는 재귀적으로 변환하세요 —
put_item전에 dict/list를 순회하며 모든 float를Decimal(str(x))로 바꾸세요.json.loads(json.dumps(obj), parse_float=Decimal)이 흔한 패턴입니다. - 다시 읽을 때 숫자 속성은
Decimal로 나옵니다. 네이티브 타입이 필요하다면 앱의 경계에서float/int로 변환하세요. - 38자리 정밀도를 넘는 값(ID, 아주 큰 정수)은 숫자가 아니라 문자열로 저장하세요 — 숫자 오버플로를 참고하세요.
FAQ
DynamoDB는 왜 Python float를 받지 않나요? DynamoDB 숫자는 임의 정밀도 십진수(최대 38자리)입니다. Python float는 IEEE-754 이진 형식이라 대부분의 십진수를 정확히 표현할 수 없으므로, boto3는 손실이 있는 근삿값을 저장하기를 거부하고 "Float types are not supported. Use Decimal types instead."를 발생시킵니다.
DynamoDB를 위해 float를 Decimal로 올바르게 변환하려면 어떻게 하나요? 문자열 형태에서 Decimal을 만드세요. Decimal(value)가 아니라 Decimal(str(value))입니다. Decimal(30.51)은 float의 이진 반올림 오차를 그대로 안고 있지만 Decimal(str(30.51))은 정확히 30.51입니다. 중첩 구조에는 json.loads(json.dumps(obj), parse_float=Decimal)을 사용하세요.
재현하기
거부는 아무것도 전송되기 전에 boto3의 직렬화기에서 일어납니다:
from boto3.dynamodb.types import TypeSerializer
TypeSerializer().serialize(1.5)실제 출력:
TypeError: Float types are not supported. Use Decimal types instead.클래스에 주목하세요. 이것은 DynamoDB 서비스 오류가 아니라 boto3에서 나온 평범한 TypeError입니다. AWS에는 아무것도 도달하지 않았으므로 HTTP 상태도, 소비된 용량도, 재시도할 요청도 없습니다 — 그리고 except ClientError 핸들러로는 잡히지 않습니다.
관련 오류
- 숫자 오버플로 — DynamoDB의 38자리 크기 범위를 벗어난 값.
- SerializationException — 숫자/문자열 와이어 타입 불일치.
- 학습: DynamoDB 데이터 타입
참고 자료
- 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
위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.
2026-07-26에 boto3 1.43.56 / botocore 1.43.56으로 재현했습니다 — 위 출력은 그대로 옮긴 것입니다.