您好,登錄后才能下訂單哦!
這篇文章主要介紹了go語言中的decimal怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇go語言中的decimal怎么使用文章都會有所收獲,下面我們一起來看看吧。
decimal是為了解決Golang中浮點數計算時精度丟失問題而生的一個庫,使用decimal庫我們可以避免在go中使用浮點數出現精度丟失的問題。
func TestFloat(t *testing.T) { a := 1100.1 b := a * 100 fmt.Println(b) // should be: 110010 output: 110009.99999999999 }
上面的精度就發生了丟失,浮點數的位數雖然我們看到的是1100.1,但對于浮點數的計算而言卻是無限接近于1,但與1不等。
當我們需要對float的數據進行計算的時候,我們可以使用第三方的decimal包來解決這個問題。
decimal的應用場景主要出現在對float浮點數進行加減乘除操作的時候,尤其是對于銀行金融一塊的業務,如果精度丟失,一筆交易上面的損失可以忽略不計,但當交易的規模達到幾千萬或者億甚至幾十億的時候,這個時候的損失就會大的嚇人了。
使用decimal第一步是引入這個包,decimal,在官方的描述中,這個包的功能描述如下:
Arbitrary-precision fixed-point decimal numbers in go.
Note: Decimal library can “only” represent numbers with a maximum of 2^31 digits after the decimal point.
go中任意精度定點的十進制數
注意:十進制庫"只能"表示小數點后最多2^31位的數字。
小數點后2^31位數字,對于絕大多數的項目精度要求是足夠的,簡而言之,decimal可以解決我們絕大多數的浮點數精度計算場景。
對于上面精度丟失的case,當我們引入decimal包之后,我們可以得到正確的結果。
func TestDecimalOne(t *testing.T){ a := 1100.1 b := 100 d := decimal.NewFromFloat(a) result := d.Mul(decimal.NewFromInt(int64(b))) fmt.Println(result) // should be: 110010, output: 110010 }
計算結果的精度沒有丟失,計算結果正確。
使用decimal的時候,切記浮點數計算所有數據的初始化必須通過decimal進行,否則還是會導致精度的丟失,為什么這么說呢,看看下面的例子你就明白了。
import ( "fmt" "github.com/shopspring/decimal" "testing" ) func TestDecimal(t *testing.T) { x := 0.28 // this will cause the multi result has error // output should be 28, but actually 28.000000000000004(error) errorMul := decimal.NewFromFloat(x * 100).String() }
上面的case就是因為100沒有使用decimal進行初始化導致最后計算的精度被擴大了。正確的處理方式如下:
import ( "fmt" "github.com/shopspring/decimal" "testing" ) func TestDecimal(t *testing.T) { x := 0.28 // the correct operate number multi is use the decimal Mul method. correctMul := decimal.NewFromFloat(x).Mul(decimal.NewFromInt(100)).String() fmt.Println(correctMul) // output: 28 }
使用IntPart可以獲取到浮點數計算結果的整數部分。
func TestDecimalTwo(t *testing.T){ a := 0.01234 b := 100 // 0.01234 * 100 = 1.234, int part=1, output=1 fmt.Println(decimal.NewFromFloat(a).Mul(decimal.NewFromInt(int64(b))).IntPart()) }
使用IntPart可以對計算后的數據進行小數點位數的補零填充。
func TestDecimalThree(t *testing.T){ a := 0.012 b := 100 x := decimal.NewFromFloat(a).Mul(decimal.NewFromInt(int64(b))) // 小數點后的位數填充, 0.012*100=1.2, 填充3位,因為已經有一位了,填充兩個0, 1.200 fmt.Println(x.StringFixed(3)) }
浮點數的比較decimal提供了一些比較有用的函數方法,這里列舉了一部分。
import ( "fmt" "github.com/shopspring/decimal" "testing" ) func TestDecimalFour(t *testing.T) { a := decimal.NewFromFloat(-1.11) b := decimal.NewFromInt(3) c, _ := decimal.NewFromString("2.023") // 是否是負數 fmt.Println(a.IsNegative()) // 取絕對值 fmt.Println(a.Abs()) // 比較是否相等 fmt.Println(a.Equal(b)) // 比較小于 fmt.Println(a.LessThan(b)) // 比較小于等于 fmt.Println(a.LessThanOrEqual(b)) // 比較大于等于 fmt.Println(b.GreaterThanOrEqual(a)) // 是否是0 fmt.Println(c.IsZero()) }
關于“go語言中的decimal怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“go語言中的decimal怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。