为什么将 float32 转换为 float64 时会丢失精度?

2023-12-28

在 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(使用前将#替换为@)

为什么将 float32 转换为 float64 时会丢失精度? 的相关文章

随机推荐