首页 >后端开发 >Golang >为什么 Go 中的无类型和类型浮点乘法会产生不同的结果?

为什么 Go 中的无类型和类型浮点乘法会产生不同的结果?

Linda Hamilton
Linda Hamilton原创
2024-12-25 16:32:11456浏览

Why Do Untyped and Typed Floating-Point Multiplications in Go Produce Different Results?

为什么这两个 float64 有不同的值?

简介

使用浮动时- 点数,了解精度限制至关重要。考虑以下 Go 代码:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)

(Go Playground 链接)

由于浮点精度,第二行产生预期结果“9.120000000000001”

问题

但是,第一行打印“9.12”,没有任何尾随精度。这就提出了一个问题:为什么 Go 不对两个无类型常量进行浮点乘法,然后将它们转换为 9.12 文字?

答案

根据根据 Go 语言规范,常量表达式被精确计算。因此,“912 * 0.01”被精确计算,与“9.12”相同。

当您将第一个操作数强制转换为 float64 (float64(912)) 时,另一个操作数 (0.01) 也将被转换为 float64 (float64(912))。隐式类型转换为 float64。 0.01 无法在 float64 中精确表示,因此与第一个示例不同的位置会丢失精度。这解释了将 fmt.Println() 与不同的输入表达式一起使用时观察到的不同结果。

以上是为什么 Go 中的无类型和类型浮点乘法会产生不同的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn