一些特定的小数用于计算总是出现精度问题, 不知道go语言是怎么处理这个问题的.
搞不懂的是第一个 两个变量 a,b 都是同一个类型,为什么相减还是会出现精度问题
package main
import "fmt"
func main() {
a := 143.66
b := 14.55
c := a - b
// c = c * 100
fmt.Println(c)
fmt.Printf("s = %T\n", a)
fmt.Printf("s = %T\n", b)
fmt.Printf("s = %T\n", c)
d := 1129.6
fmt.Println((d * 100))
}
打印的值如下:
129.10999999999999
s = float64
s = float64
s = float64
112959.99999999999
你会发现几乎所有的编程语言都有这个问题,这是典型的二进制浮点数精度损失问题,在定长条件下,二进制小数和十进制小数互转可能有精度丢失,就会造成上述现象。
解决方案就是使用精确计数算法,比如Java是使用
BigDecimal
这个特殊类实现了这个算法。对应到go就是在big这个package下实现的功能: https://golang.org/pkg/math/big/