Go 在这种情况下,为什么float32比float64更准确?

Go 在这种情况下,为什么float32比float64更准确?,go,Go,如果我运行以下Go代码: fmt.Println(float32(0.1)+float32(0.2)) 格式打印LN(浮动64(0.1)+浮动64(0.2)) 输出为: 0.3 0.30000000000000004 看起来float32和的结果比float64和的结果更精确,为什么?我认为float64总是比float32更精确。我如何决定选择哪一个结果最准确?不是fmt.Println只是让它看起来更精确Println对浮点和复数使用%g …%的默认精度g是唯一标识值所需的最小位数 0.

如果我运行以下Go代码:

fmt.Println(float32(0.1)+float32(0.2))
格式打印LN(浮动64(0.1)+浮动64(0.2))
输出为:

0.3
0.30000000000000004

看起来float32和的结果比float64和的结果更精确,为什么?我认为float64总是比float32更精确。我如何决定选择哪一个结果最准确?

不是
fmt.Println
只是让它看起来更精确
Println
对浮点和复数使用
%g

…%的默认精度g是唯一标识值所需的最小位数

0.3足以识别
float32
。但是,要精确得多,需要更多的数字

我们可以使用
fmt.Printf
%0.20g
强制两个数字显示相同的精度

f32 := float32(0.1) + float32(0.2)
f64 := float64(0.1) + float64(0.2)

fmt.Printf("%0.20g\n", f32)
fmt.Printf("%0.20g\n", f64)

0.30000001192092895508
0.30000000000000004441
float64
更精确。两者都不精确,因为这是浮点数的本质

我们可以用它来看看这些数字到底是什么

fmt.Println(strconv.FormatFloat(float64(f32), 'b', -1, 32))
fmt.Println(strconv.FormatFloat(f64, 'b', -1, 64))

10066330p-25
5404319552844596p-54

10066330*2^-25
5404319552844596*2^-54

请更精确地描述行为,而不是“更精确”。实际输出的是什么?您是否查看了每个计算的实际二进制表示形式?您不能依靠文本格式始终准确地告诉您表达式的实际计算结果。64位浮点总是比32位更精确,所以我建议这里存在某种观察错误,但是你的问题太模糊了,无法真正知道错误到底是什么。