您描述问题的方式可能具有误导性。

“将float32转换为float64时”不会丢失精度;相反,从 float64 转换为 float32 时它会丢失。

那么如何避免在从 float64 转换为 float32 时丢失精度呢?你不能。这项任务是不可能的,很容易看出原因:

  • float64 的位数是 float32 的两倍
  • 由于鸽巢原理,多个不同的 float64 值将映射到相同的 float32 值
  • 因此,这种转换是不可逆的。
package main

import (
    "fmt"
)

func main() {
    a := -8888.95
    fmt.Printf("%.20fn", a)
    fmt.Printf("%.20fn", float32(a))
    fmt.Printf("%.20fn", float64(float32(a)))
}

调整您的程序以显示每个值的更精确输出,您将准确看到精度丢失的位置:

-8888.95000000000072759576
-8888.95019531250000000000
-8888.95019531250000000000

也就是说,在 float32 转换之后(如预期的那样)。

-177779/20

如果您将此过程应用于一个数字,并且分母的质因数分解包含任何非 2 的因数,那么您可以放心,这个数字绝对不能以二进制浮点形式精确表示。您可能会发现任何数字通过此测试的概率都非常低。