登录
首页 >  Golang >  Go问答

无法将特定的 float32 值用作字典键

来源:stackoverflow

时间:2024-02-21 18:21:25 219浏览 收藏

大家好,今天本人给大家带来文章《无法将特定的 float32 值用作字典键》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

使用 float32 作为映射键返回意外结果

package main

import "fmt"

func main() {
    result := make(map[float32]map[float32]float32)

    var t1 float32 = 1586238540
    var t2 float32 = 1586238600

    result[t1] = map[float32]float32{1:1,2:2}
    result[t2] = map[float32]float32{3:3,4:4}

    fmt.println(result[t1])
    fmt.println(result[t2])
}
map[3:3 4:4]
map[3:3 4:4]

go版本:go版本go1.14 linux/amd64

result 更改为 map[float64]map[float32]float32t1t2 相应地给出正确的结果。

这种奇怪行为的原因可能是什么?


解决方案


32 位浮点数有 23 位尾数,前面隐含着最高 1 位。因此尾数可表示的最大值为 2²⁴-1 = 16777215。换句话说,只有 -16777215 到 16777215 之间的整数才能精确表示为 32 位浮点数。

您的两个值 1586238540 和 1586238600 超出了该范围,并且都被截断为相同的值 1586238592。这就是被截断的值用作地图的键。

https://play.golang.org/p/Fx78BbmnXIE、1586238540 和 1586238600 是内存中相同

今天关于《无法将特定的 float32 值用作字典键》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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