在 Go 中,将 float32 数字转换为 float64 精度会丢失。例如,将 359.9 转换为 float64 会产生 359.8999938964844。如果 float32 可以精确存储,为什么 float64 会失去精度?
示例代码:
package main
import (
"fmt"
)
func main() {
var a float32 = 359.9
fmt.Println(a)
fmt.Println(float64(a))
}
Try it on Playground https://play.golang.org/p/h3gKoaQL8o
You never从 a 转换时会失去精度float
(即 float32)到double
(浮点64)。前者must是后者的子集。
这更多地与输出格式化程序的默认精度有关。
最近的 IEEE754float
到 359.9 是
359.899993896484375
最近的 IEEE754double
到 359.9 是
359.8999999999999772626324556767940521240234375
最近的 IEEE754double
到 359.899993896484375 是
359.899993896484375
(即相同;由于我已经提到的子集规则)。
所以你可以看到float64(a)
是相同的float64(359.899993896484375)
这是359.899993896484375
。这解释了该输出,尽管您的格式化程序对最后 2 位数字进行了四舍五入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)