在Golang中,似乎当一个float64 var首先转换为float32然后转换float64时,它的值会改变。
a := -8888.95
fmt.Println(a) // -8888.95
fmt.Println(float32(a)) // -8888.95
fmt.Println(float64(float32(a))) // -8888.9501953125
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它不变
Hym*_*sco 11
您描述问题的方式可能具有误导性。
“将float32转换为float64时”不会丢失精度;相反,从 float64 转换为 float32 时它会丢失。
那么如何避免在从 float64 转换为 float32 时丢失精度呢?你不能。这项任务是不可能的,很容易看出原因:
package main
import (
"fmt"
)
func main() {
a := -8888.95
fmt.Printf("%.20f\n", a)
fmt.Printf("%.20f\n", float32(a))
fmt.Printf("%.20f\n", float64(float32(a)))
}
Run Code Online (Sandbox Code Playgroud)
调整您的程序以显示每个值的更精确输出,您将准确看到精度丢失的位置:
-8888.95000000000072759576
-8888.95019531250000000000
-8888.95019531250000000000
Run Code Online (Sandbox Code Playgroud)
也就是说,在 float32 转换之后(如预期的那样)。
另外值得一提的是,无论float64也不FLOAT32能代表你的价值-8888.95准确。如果您将此数字转换为分数,您将得到-177779/20
。注意分母 20。 20 的质因数分解是 2 * 2 * 5。
如果您将此过程应用于一个数字,并且分母的质因数分解包含任何非 2 的因数,那么您可以放心,这个数字绝对不能以二进制浮点形式精确表示。您可能会发现任何数字通过此测试的概率都非常低。