为什么这两个 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中文网其他相关文章!