在Go中存儲和計算貨幣的正確方法是什麼?似乎沒有相應的十進制類型,使用浮點數是一個很大的問題。如何在Go中表示貨幣?
回答
我想說的一種方式是使用正確大小的整數類型來存儲大量的金錢,規範化爲儘可能低的金額。比方說,如果您需要以美元存儲金額降至1美分,請將您的價值乘以100,並將其存入全美分。
另一種方式是實現這將模擬什麼是「十進制」,在其他一些語言,也就是說,它會用兩個整數來表示的金額自定義類型。
我喜歡這個想法。使用兩個整數(整數和十進制數)定義結構,然後可以爲您的貨幣類型聲明自定義方法,包括轉換等。 – Matt
實際上有a few packages實現一個十進制類型,雖然沒有明確的領導者。
理性數字是代表貨幣價值的相當好的解決方案。也就是說,這是一種具有分子和分母的類型。
通常貨幣數據結構過於複雜 - Java的BigDecimal就是一個例子。數學上更一致的方法是定義一個處理有理數的類型。當使用64位整數時,可以準確有效地表示大量的數字。錯誤和舍入問題比任何需要將二進制分數轉換爲/從小數分數的解決方案都要少。
編輯:Go標準庫包括arbitrary-precision integers and rational numbers。 Rat類型對貨幣來說效果很好,特別是那些需要任意精度的情況,例如。外匯。這裏的an example。
這似乎是一個很好的機會,創造一個類型,它存儲在一個安全和精確的基於整數路的價值,但給你,你會從一個小數類型要額外行爲。例如,快速實現可能是這樣的(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 = $ 0.89
- 1. mongoid中的貨幣表示
- 2. 如何在UILabel中顯示貨幣值?
- 3. 在Google圖表中顯示貨幣API
- 4. 在C中顯示貨幣#
- 5. 在gridview中顯示貨幣
- 6. 如何貨幣之前顯示浮動貨幣與負號
- 7. Android貨幣類別 - 如何獲取貨幣的顯示名稱?
- 8. 貨幣列表與貨幣符號和貨幣名稱母語
- 9. 非十進制貨幣在軟件中是如何表示的?
- 10. 如何代表貨幣或貨幣使用C
- 11. 在Grails中代表貨幣(價值+貨幣)的最佳實踐
- 12. 負貨幣顯示
- 13. PHP貨幣顯示
- 14. 在magento顯示貨幣代碼和貨幣符號
- 15. 如何從iphone中的貨幣代碼獲取貨幣符號?
- 16. LINQ和如何顯示貨幣
- 17. 如何顯示貨幣登錄FPDF-php
- 18. 如何使用NSNumberFormatter顯示貨幣?
- 19. 如何通過Double修復貨幣表示中的錯誤?
- 20. 如何顯示歐洲貨幣符號€在一個JavaFX表
- 21. symfony2中的貨幣列表
- 22. CSS中的貨幣表
- 23. ISO貨幣列表
- 24. 在IB中顯示NSDecimalNumber作爲貨幣
- 25. 如何在RainMeter中格式化貨幣?
- 26. 如何在PostgreSQL中格式化貨幣
- 27. 如何在opencart中添加貨幣?
- 28. 如何在VB.NET中格式化貨幣
- 29. 如何在python中轉換貨幣?
- 30. 如何使用Delphi的AsCurrency顯示貨幣沒有貨幣符號?
你試過[math.big](http://golang.org/pkg/math/big/ )用你自己的定點算法在上面? – fuz