2014-09-24 4 views
2

나는 Go에 온라인 상점을 짓고 있습니다. 예상되는대로 몇 가지 중요한 부분은 정확한 화폐 금액을 기록해야합니다. float와 관련된 반올림 문제를 알고 있습니다 (예 : 0.3은 정확하게 표현할 수 없습니다.).구매/재무 계산 유형 이동

통화 개념은 문자열로 표현하기 쉽습니다. 그러나, 나는의 실제 금액을 표현하는 가장 적절한 것 어떤 종류의 확실 해요

의 핵심 요구 사항

이 될 것 같다 :.

  • 정확히 아래의 지정된 번호로 진수를 표현할 수 소수점 이하 자릿수 (소수점 이하 2 자리를 사용하는 일부 통화 : http://www.londonfx.co.uk/ccylist.html)
  • add/sub/mul/div는 분명 기본 산술 연산이 필요합니다.
  • 사인 (sane) 문자열 변환 - 본질적으로 10 진수로 변환하는 것을 의미합니다. 또한 국제화는 모든 논리가 구축되지 않아도 가능합니다 (유럽의 경우 1.000 대 미국의 경우 1,000).
  • Banker의 반올림과 같은 반올림 스키마를 사용하여 반올림합니다.
  • 데이터베이스 값에 해당하는 간단하고 분명한 방법이 필요합니다 (필자의 경우 MySQL). (이 값을 정확하게 유지하기 위해 값을이 수준에서 문자열로 취급하는 것이 가장 합리적 일 수 있습니다.)

저는 수학/big.Rat을 알고 있으며 많은 것을 해결할 것 같습니다. 예를 들어 문자열 출력은 "a/b"형식으로 출력되기 때문에 그대로 작동하지 않습니다. 나는 거기에 대한 해결책도 있다고 확신하지만, 이런 종류의 일에 대해 잘 모르는 (존재하지 않는) 모범 사례가 있는지 궁금합니다.

업데이트 :이 패키지는 유망 같습니다 https://code.google.com/p/godec/

+0

빠른 반응 : 단위, 문화 (EUR 금액은 다른 국가에서 다른 방식으로 인쇄되기 때문에), 그리고 고정 소수점 int (예 : USD, 센트 등)를 포함하는'struct' 유형이 실제로 필요하다고 생각하십니까? 또는 센트 * 10; 저장된 정밀도는 국가마다 다를 수 있으며, 반올림 오류를 제어하는 ​​데 항상 4 자리 숫자를 사용할 수 있습니다. 반올림을 제어하려면 메서드 (예 : amt.Div (3)가 amt.Units/= 3이 아닌)를 통해 수학 연산을 게이트해야한다고 생각합니다. – twotwotwo

+0

자체 흥미로운 것을 저장하고 있습니다. 통화가 저장된 곳마다 * 데이터베이스 열 3 개, 금액, 통화 및 거래시 고객의 표준 통화로 대략 변환 된 금액을 원할 수 있습니다. – twotwotwo

+0

기존 모델을 빨리 찾을 수는 없었지만 대체로 여러분이 직접 무언가를 구현하고 싶다는 생각이 들었습니다. 더 많은 것이 화재와 모션입니다 (http : // www.joelonsoftware.com/articles/fog0000000339.html)보다 영리합니다. – twotwotwo

답변

3

당신은 당신의 통화 구현에서 분리 국제화를 유지해야합니다. 아니, 모든 것을 구조체에 묶어서 하루로 부르지 마십시오. 금액이 나타내는 통화를 표시하지만 아무것도 표시하지 않습니다. i18n이 서식, 문자열, 접두사 등을 처리하도록하십시오.

math/big.Rat과 같은 임의의 정밀 숫자 형식을 사용하십시오. 이것이 직렬화 제한이나 다른 장벽으로 인해 옵션이 아닌 경우 가장 큰 고정 크기 정수 유형을 사용하여 어떤 통화로도 원자 금액을 나타낼 수 있습니다. – 센트 (USD), 엔 (yen) CHF는 rappen, EUR는 센트 등입니다.

두 번째 방법을 사용하는 경우 오버플로가 발생하지 않도록주의하고 나누기에 대해 명확하고 의미있는 반올림 동작을 정의하십시오.