2013-12-15 2 views
2

Go에서 통화를 저장하고 계산하는 올바른 방법은 무엇입니까? 상응하는 십진수 유형이없는 것처럼 보이며 수레를 사용하는 것은 큰 일이 아닙니다.Go에서 통화를 나타내는 법?

+1

0.89 당신이 ([math.big] 해봤 http://golang.org/pkg/math/big/) 위에 고정 소수점 산술 연산을 사용합니까? – fuz

답변

5

내가 할 수있는 한 가지 방법은 적절한 크기의 정수 유형을 사용하여 금액을 저장하는 것입니다. 가능한 한 가장 작은 금액으로 정규화합니다. 미국 달러에서 1 센트까지 금액을 저장해야하는 경우 값을 100으로 곱한 후 전체 센트로 저장하십시오.

또 다른 방법은 다른 언어에서 "십진수"를 모델링하는 사용자 지정 유형을 구현하는 것입니다. 즉, 금액을 나타 내기 위해 두 개의 정수를 사용하는 것입니다.

+0

나는 그 생각을 좋아한다. 2 개의 정수, 전체 및 십진수로 구조체를 정의한 다음 변환 등을 포함하여 통화 유형에 대한 사용자 정의 메서드를 선언 할 수 있습니다. – Matt

1

십진 형식을 구현하는 실제로는 a few packages이지만 명확한 리더는 없습니다.

1

합리적인 수치는 화폐 가치를 나타낼 때 아주 좋은 해결책입니다. 즉, 분자와 분모가있는 유형입니다.

종종 화폐 데이터 구조가 지나치게 복잡합니다. 예를 들어 Java의 BigDecimal이 복잡합니다. 수학적으로 일관된 접근법은 유리수를 처리하는 형식을 정의하는 것입니다. 64 비트 정수가 사용될 때, 엄청난 수의 범위가 정확하고 효율적으로 표현 될 수 있습니다. 오류 및 반올림 문제는 이진수를 십진수로 변환해야하는 솔루션보다 문제가 적습니다.

편집 : Go 표준 라이브러리에는 arbitrary-precision integers and rational numbers이 포함됩니다. Rat 유형은 통화, 특히 임의 정밀도가 필요한 경우에 적합합니다. 외국환. 여기에 an example이 있습니다.

0

이것은 안전하고 정확한 정수 기반 방식으로 값을 저장하는 유형을 만드는 좋은 기회 인 것처럼 보이지만 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 = $

관련 문제