나는 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/
빠른 반응 : 단위, 문화 (EUR 금액은 다른 국가에서 다른 방식으로 인쇄되기 때문에), 그리고 고정 소수점 int (예 : USD, 센트 등)를 포함하는'struct' 유형이 실제로 필요하다고 생각하십니까? 또는 센트 * 10; 저장된 정밀도는 국가마다 다를 수 있으며, 반올림 오류를 제어하는 데 항상 4 자리 숫자를 사용할 수 있습니다. 반올림을 제어하려면 메서드 (예 : amt.Div (3)가 amt.Units/= 3이 아닌)를 통해 수학 연산을 게이트해야한다고 생각합니다. – twotwotwo
자체 흥미로운 것을 저장하고 있습니다. 통화가 저장된 곳마다 * 데이터베이스 열 3 개, 금액, 통화 및 거래시 고객의 표준 통화로 대략 변환 된 금액을 원할 수 있습니다. – twotwotwo
기존 모델을 빨리 찾을 수는 없었지만 대체로 여러분이 직접 무언가를 구현하고 싶다는 생각이 들었습니다. 더 많은 것이 화재와 모션입니다 (http : // www.joelonsoftware.com/articles/fog0000000339.html)보다 영리합니다. – twotwotwo