[英]golang losing precision while converting float32 to float64?
在 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
我怎样才能让它不变
您描述问题的方式可能具有误导性。
“将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)))
}
调整您的程序以显示每个值的更精确的 output,您将确切地看到精度丢失的位置:
-8888.95000000000072759576
-8888.95019531250000000000
-8888.95019531250000000000
也就是说,在 float32 转换之后(如预期的那样)。
还值得注意的是,float64 和 float32都不能准确地代表您的值 -8888.95。 如果将此数字转换为分数,您将得到-177779/20
。 注意分母 20。20 的素数分解是 2 * 2 * 5。
如果您将此过程应用于一个数字并且分母的素数分解包含任何不是 2 的因子,那么您可以确保该数字绝对不能以二进制浮点形式精确表示。 您可能会发现任何数字通过此测试的概率非常低。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.