首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将特定的float32值用作映射键

不能将特定的float32值用作映射键
EN

Stack Overflow用户
提问于 2020-04-07 07:24:50
回答 3查看 677关注 0票数 2

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

代码语言:javascript
复制
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])
}
代码语言:javascript
复制
map[3:3 4:4]
map[3:3 4:4]

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

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

为什么会有这种奇怪的行为?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-07 07:34:24

一个32位浮点数有一个23位尾数,隐含在最高的1位前。所以尾数代表的最大值是2平方⁴-1= 16777215.换句话说,只有-16777215到16777215之间的整数才能被精确地表示为32位浮点数的

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

票数 10
EN

Stack Overflow用户

发布于 2020-04-07 07:47:28

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

票数 2
EN

Stack Overflow用户

发布于 2020-04-07 07:58:45

如果将此添加到代码中

代码语言:javascript
复制
fmt.Println(t1)
fmt.Println(t2)

您将把1.5862386e+09看作两者的结果,因为对于float32来说,这个值太大了。使用float64,您将看到正确的值打印

代码语言:javascript
复制
1.58623854e+09
1.5862386e+09

有关更多信息,维基百科

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

https://stackoverflow.com/questions/61074776

复制
相关文章

相似问题

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