go float 精度丢失问题

一些特定的小数用于计算总是出现精度问题, 不知道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
阅读 15.2k
2 个回答

你会发现几乎所有的编程语言都有这个问题,这是典型的二进制浮点数精度损失问题,在定长条件下,二进制小数和十进制小数互转可能有精度丢失,就会造成上述现象。

解决方案就是使用精确计数算法,比如Java是使用BigDecimal这个特殊类实现了这个算法。

对应到go就是在big这个package下实现的功能: https://golang.org/pkg/math/big/

这个和语言无关,所有的语言都是这样的,只要是float或者double类型都有这个问题,因为他们本身就是有误差的,如果要做到无误差,Java有个BigDecimal可以用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题