首页 > 后端开发 > Golang > 为什么 Go 中的 `912 * 0.01` 与 `float64(912) * 0.01` 不同?

为什么 Go 中的 `912 * 0.01` 与 `float64(912) * 0.01` 不同?

Linda Hamilton
发布: 2024-12-16 19:00:15
原创
571 人浏览过

Why Does `912 * 0.01` Differ from `float64(912) * 0.01` in Go?

Float64 精度的差异:解包不同的值

考虑 Go 中的以下示例:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
登录后复制

第一个语句打印 9.12,而第二个语句输出9.120000000000001。这种明显的精度差异可能令人费解。

根据 Go 语言规范,常量表达式是精确计算的。在本例中,912 * 0.01 是一个常量表达式。精确计算它会产生 9.12,随后将其分配给 float64(912 * 0.01) 并传递给 fmt.Println()。

或者,float64(912) * 0.01 也是一个常量表达式。然而,左操作数原本是一个整数,在乘法之前被显式转换为 float64。这意味着 0.01 也会隐式转换为 float64,从而导致两个 float64 值之间的乘法。

至关重要的是,0.01 不能精确地表示为 float64。它被四舍五入到最接近的可表示值,这会带来轻微的不精确性。结果,float64(912) * 0.01 计算结果为 9.120000000000001,然后将其打印出来。

总之,输出的差异源于常量表达式的计算:强制转换是发生在计算之前还是计算期间,以及是否由于float64精度的限制引入了不精度。

以上是为什么 Go 中的 `912 * 0.01` 与 `float64(912) * 0.01` 不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板