부동소수점 오차를 피해야 하는 계산을 다룹니다.
Decimal은 십진 문자열을 기준으로 정확한 십진 계산을 제공합니다. 금액을 만들 때 float를 먼저 거치면 이미 생긴 오차도 함께 전달되므로 문자열에서 Decimal을 생성하는 습관이 중요합니다.
price와 discount_rate를 문자열에서 만들었기 때문에 19.90과 0.10이 십진수 그대로 저장됩니다. Decimal에 정수 quantity를 곱하는 것은 문제없이 계산되어 59.70이 되고, 1에서 할인율을 뺀 0.90을 곱하면 소수 넷째 자리까지 있는 53.7300이 됩니다. quantize가 이를 소수 둘째 자리에 맞춰 53.73을 출력합니다.
Decimal과 float를 무심코 섞지 말고 한 계산 흐름에서 숫자 표현 방식을 통일합니다. quantize로 필요한 자릿수와 반올림 규칙을 명시할 수 있습니다.
결제 시스템에서는 통화별 최소 단위, 세금 반올림 시점, 합계 검증 규칙을 도메인 정책으로 고정해야 합니다.
Decimal(0.1)과 Decimal('0.1')은 같다고 생각하기 쉽지만 전자는 float의 근삿값을 가져옵니다.
직접 바꿔보세요할인율을 15%로 바꾸고 최종 금액을 소수 둘째 자리로 반올림하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.