2014-10-02 3 views
2

금전적 가치는 반올림 오류 문제로 인해 정수로 저장되고 처리되어야한다는 것을 알고 있습니다. 그것은 나에게 의미가 있으며 나는 그것을 얻는다 (나는 생각한다).세율을 정수로 저장해야합니까?

하지만 세율은 어떻게됩니까? 10 진수가 아닌 정수로 세율 (6.5 또는 8.125와 같은 세율, 세율 등)을 저장해야하는 이유가 있습니까?

그리고 세율을 정수로 저장하는 경우 거래에서 세금 금액을 달러 금액에 어떻게 적용합니까? 6.5 %의 세율에 대해 10000 * 1.065 ($ 100.00 * 1.065)를 수행하면 데이터베이스에 6.5 %를 6.500과 반대로 6500으로 저장하면 어떤 이점이 있습니까? 나는 한 번에 100을 곱하거나 나누는 것이 반올림 오류의 영향을 받기 쉬운 것이라고 생각하지 않습니다.

세율은 어떻게 저장합니까?

+0

부동 소수점 연산에서 문제가 발생합니다 ([여기에 하나의 설명이 나와 있습니다] (https://docs.python.org/2/tutorial/floatingpoint.html)). 세율을 부동 소수점이 아닌 * 소수 *로 저장하고 수식의 결과가 부동 소수점이 아닌 * 십진수 * 정밀도 값이되도록하려면 반올림이 있는지를 모릅니다 오류. 어떤 환경에서 이것을하고 있습니까? 더 많은 정보 & 유스 케이스/예제와 누군가가 더 많은 지침을 제공 할 수 있습니다. –

답변

2

첫째, 소수점을 사용하면 안됩니다. 정확한 값을 원할 때 부동 소수점을 사용하면 안됩니다. 모든 소수는 부동 소수점이 아닙니다. C#의 10 진수 데이터 유형 또는 Java의 java.math.BigDecimal을 참조하십시오.

두 번째로 10의 거듭 제곱은 특히 부동 소수점 문제가 발생하기 쉽기 때문에 부동 소수점을 구현하면 10의 제곱으로 나눗셈을 수행 할 때 소수 자릿수가 무한히 반복됩니다. this question을 참조하십시오. 간단한 예가 있습니다 :

이것은 0.1의 표현이 잘리지 않는 반복되는 십진수이기 때문에 발생합니다. 여기서 REPL은 거짓말을했습니다. 실제로는 f가 0.1이 아니라 0.100000001490116119384765625입니다.

당신은 there's an argument for doing that를이 반올림하고 갈 수 :

이 문제를 해결하려면 적절한 라운딩을 제공해야합니다. 돈으로는 소수 자릿수가 얼마나 적절한 지 알면 쉽게 알 수 있으며 70 조 달러가 아니면 반올림 오류를 해결할 수 없을 정도로 커지지 않습니다.

그러나 사용 BigDecimal를 : 당신은 당신이 번호를 정확히 알 수 있도록

groovy:000> d = new BigDecimal("0.1") 
===> 0.1 
groovy:000> d * 100 
===> 10.0 

는 고정 소수점 진수를 사용합니다. 귀하의 언어에 고정 소수점 이하 자릿수 (예 : 자바 스크립트)가없는 경우 you may have to fall back on integers.

+0

알았어요. 통화에 대해 항상 고정 소수점 수에 고정 소수점 수를 곱하고 싶다고 말하는 것이 맞습니까? –

+0

그리고 이것은 완전히 별개의 질문입니다. 그러나 저는 왜 많은 사람들이 달러 금액 대신에 "센트"로 통화 가치를 저장하는 것을 옹호하는 것을 보았는지에 대해 완전히 혼란스러워하고 있습니다. 100.00 대신 10000 –

+0

@ Jason : 꽤 많이. http://vanillajava.blogspot.com/2011/08/double-your-money-again.html에서 흥미로운 기사가 ​​있습니다. 그러나 당신은 당신이하고있는 것을 알아야합니다. –