Go语言的坑: Float 的精度

Go语言的坑: Float 的精度

[toc]

在 Go 中浮点数表示方式和其他语言一样,都是通过科学计数法表示,float 在存储中分为三部分:

符号位(Sign): 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾数部分(Mantissa):尾数部分

这种计数法在 Go 里面会有哪些问题。

a := 100000.001
b := 1.0001
c := 1.0002

fmt.Println(a * (b + c))
fmt.Println(a*b + a*c)

输出:

200030.00200030004
200030.0020003

如果想要准确计算浮点的话,可以尝试 https://github.com/shopspring/decimal

a := decimal.NewFromFloat(100000.001)
b := decimal.NewFromFloat(1.0001)
c := decimal.NewFromFloat(1.0002)

fmt.Println(a.Mul(b.Add(c))) //200030.0020003

其他

在 Go 中探索 IEEE-754 标准 - Go语言中文网 - Golang中文社区 (studygolang.com)

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计