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 응답).

어떻게 해결하는가

  1. 쓰기 전에 decimal.Decimal로 변환하세요:
    from decimal import Decimal
    table.put_item(Item={'pk': 'ORDER#1', 'total': Decimal('30.51')})
  2. float이 아니라 str에서 Decimal을 만드세요Decimal(30.51)은 이진 부동소수점 오차를 물려받지만(30.510000000000001...), Decimal(str(30.51))은 정확히 30.51이 됩니다.
  3. 중첩된 데이터는 재귀적으로 변환하세요put_item 전에 dict/list를 순회하며 모든 float를 Decimal(str(x))로 바꾸세요. json.loads(json.dumps(obj), parse_float=Decimal)이 흔한 패턴입니다.
  4. 다시 읽을 때 숫자 속성은 Decimal로 나옵니다. 네이티브 타입이 필요하다면 앱의 경계에서 float/int로 변환하세요.
  5. 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 핸들러로는 잡히지 않습니다.

관련 오류

참고 자료

위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.

2026-07-26에 boto3 1.43.56 / botocore 1.43.56으로 재현했습니다 — 위 출력은 그대로 옮긴 것입니다.

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.