为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁星点点滴滴 2023-07-04 14:51:18
如果我运行以下 Go 代码:fmt.Println(float32(0.1) + float32(0.2)) fmt.Println(float64(0.1) + float64(0.2))输出是:0.3 0.30000000000000004看来 float32 sum 的结果比 float64 sum 的结果更精确,为什么?我认为 float64 总是比 float32 更精确。我如何决定选择哪一个以获得最准确的结果?
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

事实并非如此。fmt.Println只是让它看起来更精确。Println用于%g浮点数和复数。文档说...

默认精度... %g 它是唯一标识该值所需的最小位数。

0.3 足以识别float32. 但float64更精确需要更多的数字。

我们可以使用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更精确。两者都不精确,因为这是浮点数的本质。


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


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。


查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信