在Go中,将float32数字转换为float64精度时会丢失精度。例如,将359.9转换为float64会生成359.8999938964844。如果float32可以精确存储,为什么float64会丢失精度?

样例代码:

package main

import (
    "fmt"
)

func main() {
    var a float32 = 359.9
    fmt.Println(a)
    fmt.Println(float64(a))
}

Playground上尝试

最佳答案

float(即float32)转换为double(float64)时,您永远不会失去精度。前者必须是后者的子集。

更多与输出格式化程序的默认精度有关。

最接近359.9的IEEE754 float

359.899993896484375

最接近359.9的IEEE754 double
359.8999999999999772626324556767940521240234375

与359.899993896484375最近的IEEE754 double
359.899993896484375

(即是相同的;由于我已经提到过子集规则)。

因此,您可以看到float64(a)float64(359.899993896484375)相同。这说明了该输出,尽管格式化程序将最后两位数字取整。

10-06 02:00