文章目錄
- 問題
- 解決
- 注意
問題
go float 在運算的時候會出現精度問題
package mainimport ("fmt"
)func main() {var a float64 = 0.3var b float64 = 0.6fmt.Println("a+b=", a+b) // 你以為是 0.9 但是結果是:0.8999999999999999
}
你觀察到的
0.3 + 0.6 = 0.8999999999999999
現象是由于計算機使用二進制浮點數表示十進制小數時的固有精度問題,而不是 Go 語言特有的問題。這是所有使用 IEEE 754 浮點數標準的編程語言都會遇到的情況
解決
使用 decimal 包解決 golang 浮點數運算失真
代碼如下:
package mainimport ("fmt""github.com/shopspring/decimal"
)func main() {var a float64 = 0.3var b float64 = 0.6a1 := decimal.NewFromFloat(a)b1 := decimal.NewFromFloat(b)fmt.Println("a+b=", a1.Add(b1)) // 0.9
}
注意
decimal建議只用做 float 計算;不建議用來字符串和浮點數之間轉換: decimal.NewFromString(“1”) , 大量數據計算下性能差
原文地址
使用 decimal 包解決 go float 浮點數運算失真