登录
首页 >  Golang >  Go问答

Golang int 转换为 float32 时存在精度丢失问题

来源:stackoverflow

时间:2024-02-15 14:24:22 115浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Golang int 转换为 float32 时存在精度丢失问题》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

任何人都可以解释为什么以下转换会失去精度吗?

func main() {
    var a int32 = 1273478460 

    fmt.Println(a)
    fmt.Printf("%f \n", float64(a)) // 1273478460.000000, this is right number
    fmt.Printf("%f \n", float32(a)) // 1273478400.000000, this is wrong number
}

正确答案


浮点用精度换取范围。 IEEE-754 单精度(32 位)浮点占用 1 个完整的 32 位字(自然)。它有

  • 1 个符号位,
  • 8 位指数,
  • 23 位尾数

可以安全地用单精度浮点数表示的最大整数(由于尾数的表示方式,给出了隐式的额外精度位)是224(十进制 16,777,216);可以安全表示的最小整数是 - (224) (十进制 -16,777,216)。这给出了 33,554,433 个整数的范围。

对于双精度浮点数(1 个符号位、11 位指数、52 位尾数),其类似:

  • 最小安全整数为- (253)(十进制 9,007,199,254,740,992)
  • 最大安全整数为 253(十进制 9,007,199,254,740,992)

另请参阅 What Every Computer Scientist Should Know About Floating-Point Arithmetic。发表于 ACM 计算调查,第 23 卷,第 1 期,1991 年 3 月。基本阅读。

本篇关于《Golang int 转换为 float32 时存在精度丢失问题》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>