Go에서 통화를 저장하고 계산하는 올바른 방법은 무엇입니까? 상응하는 십진수 유형이없는 것처럼 보이며 수레를 사용하는 것은 큰 일이 아닙니다.Go에서 통화를 나타내는 법?
답변
내가 할 수있는 한 가지 방법은 적절한 크기의 정수 유형을 사용하여 금액을 저장하는 것입니다. 가능한 한 가장 작은 금액으로 정규화합니다. 미국 달러에서 1 센트까지 금액을 저장해야하는 경우 값을 100으로 곱한 후 전체 센트로 저장하십시오.
또 다른 방법은 다른 언어에서 "십진수"를 모델링하는 사용자 지정 유형을 구현하는 것입니다. 즉, 금액을 나타 내기 위해 두 개의 정수를 사용하는 것입니다.
나는 그 생각을 좋아한다. 2 개의 정수, 전체 및 십진수로 구조체를 정의한 다음 변환 등을 포함하여 통화 유형에 대한 사용자 정의 메서드를 선언 할 수 있습니다. – Matt
십진 형식을 구현하는 실제로는 a few packages이지만 명확한 리더는 없습니다.
합리적인 수치는 화폐 가치를 나타낼 때 아주 좋은 해결책입니다. 즉, 분자와 분모가있는 유형입니다.
종종 화폐 데이터 구조가 지나치게 복잡합니다. 예를 들어 Java의 BigDecimal이 복잡합니다. 수학적으로 일관된 접근법은 유리수를 처리하는 형식을 정의하는 것입니다. 64 비트 정수가 사용될 때, 엄청난 수의 범위가 정확하고 효율적으로 표현 될 수 있습니다. 오류 및 반올림 문제는 이진수를 십진수로 변환해야하는 솔루션보다 문제가 적습니다.
편집 : Go 표준 라이브러리에는 arbitrary-precision integers and rational numbers이 포함됩니다. Rat 유형은 통화, 특히 임의 정밀도가 필요한 경우에 적합합니다. 외국환. 여기에 an example이 있습니다.
이것은 안전하고 정확한 정수 기반 방식으로 값을 저장하는 유형을 만드는 좋은 기회 인 것처럼 보이지만 10 진수 유형에서 원하는 추가 동작을 제공합니다. 예를 들어, 빠른 구현이 (https://play.golang.org/p/nYbLiadQOc)과 같습니다
// USD represents US dollar amount in terms of cents
type USD int64
// ToUSD converts a float64 to USD
// e.g. 1.23 to $1.23, 1.345 to $1.35
func ToUSD(f float64) USD {
return USD((f * 100) + 0.5)
}
// Float64 converts a USD to float64
func (m USD) Float64() float64 {
x := float64(m)
x = x/100
return x
}
// Multiply safely multiplies a USD value by a float64, rounding
// to the nearest cent.
func (m USD) Multiply(f float64) USD {
x := (float64(m) * f) + 0.5
return USD(x)
}
// String returns a formatted USD value
func (m USD) String() string {
x := float64(m)
x = x/100
return fmt.Sprintf("$%.2f", x)
}
주어진 유형은 하나가 특히 까다로운 사용 사례 제공, 기대 수있는 방식으로 동작합니다.
fmt.Println("Product costs $9.09. Tax is 9.75%.")
f := 9.09
t := 0.0975
ft := f * t
fmt.Printf("Floats: %.18f * %.18f = %.18f\n", f, t, ft)
u := ToUSD(9.09)
ut := u.Multiply(t)
fmt.Printf("USD: %v * %v = %v\n", u, t, ut)
제품은 $ 9.09의 요금으로 제공됩니다. 세금은 9.75 %입니다.
수레 : 9.089999999999999858 * 0.097500000000000003 = 0.886275000000000035
USD : $ 9.09 * 0.0975 = $
- 1. 파이썬에서 행렬을 나타내는 법
- 2. 엔티티처럼 클래스를 나타내는 법?
- 3. matlab에있는 modx에 Bitxor를 나타내는 법
- 4. z3py에서 대수 수식을 나타내는 법
- 5. Functional Python에서 객체를 나타내는 법?
- 6. AbstractTableModel에서 복잡한 클래스를 나타내는 법?
- 7. Scala.js에서 헥스 색상을 나타내는 법?
- 8. LaTeX에서 클래스 이름을 나타내는 법?
- 9. 아이폰에서 녹음 과정을 나타내는 법?
- 10. simple_form 몽고이드 배열을 나타내는 법
- 11. Regex에서 다음 패턴을 나타내는 법?
- 12. 어셈블리에서 8 진수를 나타내는 법?
- 13. 안드로이드 갤러리에서 이미지를 나타내는 법
- 14. 아이폰에 도트 기호를 나타내는 법
- 15. postgresql에서 작은 숫자를 나타내는 법?
- 16. Go에서 인터페이스로 JSON을 언 마샬하는 법
- 17. 올바른 순서로 숫자로 히브리어를 나타내는 법
- 18. Red/System에서 16 진수 문자열을 나타내는 법?
- 19. Eigen에서 Compact isometry 변환 행렬을 나타내는 법?
- 20. 아파치 절약에서 날짜 유형을 나타내는 법
- 21. Visual C++에서 공백을 나타내는 법?
- 22. PHP 배열에서 마지막 인디 스를 나타내는 법?
- 23. Django-haystack - 검색 색인에서 관계를 나타내는 법?
- 24. 파이썬에서 바이트 json 문자열을 나타내는 법
- 25. 상호 교환 가능한 열을 나타내는 법
- 26. R에서 비정규 화 된 테이블을 나타내는 법? 다음과 같은
- 27. 녹 데이터 구조에서 재귀 EBNF 문법을 나타내는 법?
- 28. 전화 번호가 2147483647로 변경 되었습니까? 전화 번호를 나타내는 법?
- 29. 혼합형 배열을 나타내는 방법
- 30. Go에서 urllib.quote()?
0.89 당신이 ([math.big] 해봤 http://golang.org/pkg/math/big/) 위에 고정 소수점 산술 연산을 사용합니까? – fuz