在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)
相同。这说明了该输出,尽管格式化程序将最后两位数字取整。