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中文网其他相关文章!