首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在将float32转换为float64时,golang失去了精度吗?

问在将float32转换为float64时,golang失去了精度吗?
EN

Stack Overflow用户
提问于 2021-04-18 13:09:09
回答 1查看 309关注 0票数 0

在Golang中,当float64变量首先转换为float32,然后转换为float64时,它的值似乎会发生变化。

代码语言:javascript
复制
a := -8888.95
fmt.Println(a)                    // -8888.95
fmt.Println(float32(a))           // -8888.95
fmt.Println(float64(float32(a)))  // -8888.9501953125

我怎样才能让它保持不变?

EN

回答 1

Stack Overflow用户

发布于 2021-04-18 13:40:30

你描述这个问题的方式可能是误导的。

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

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

由于pigeonhole principle

  • the转换是不可逆的,因此
  • float64的位数是的两倍,不同的float64值将映射到相同的float32值。

代码语言:javascript
复制
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)))
}

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

代码语言:javascript
复制
-8888.95000000000072759576
-8888.95019531250000000000
-8888.95019531250000000000

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

同样值得注意的是,无论是float64还是float32都不能准确地表示您的值-8888.95。如果你把这个数字转换成分数,你会得到-177779/20。注意分母20,20的素数分解是2*2* 5。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67145364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档