我有一个浮点列表(实际上是一个 Pandas 系列对象,如果它有任何改变的话),看起来像这样:
mySeries:
...
22 16.0
23 14.0
24 12.0
25 10.0
26 3.1
...
(因此,该系列的元素在右侧,索引在左侧。)然后,我尝试将该系列的元素分配为字典中的键,并将索引分配为值,如下所示:
{ mySeries[i]: i for i in mySeries.index }
而且我得到了我想要的东西,除了...
{ 6400.0: 0, 66.0: 13, 3.1000000000000001: 23, 133.0: 10, ... }
为什么
3.1
突然变成了3.1000000000000001
?我想这与浮点数的表示方式(?)有关,但是为什么现在会发生这种情况,以及如何避免/修复它?编辑:如果不正确,请随时为这个问题建议一个更好的标题。
编辑2:好吧,所以看起来它是完全相同的数字,只是打印方式不同。不过,如果我将
mySeries[26]
分配为字典键,然后尝试运行:myDict[mySeries[26]]
我得到
KeyError
。避免这种情况的最好方法是什么? 最佳答案
该词典没有更改3.1的浮点表示形式,但实际上显示的是全精度。您对mySeries [26]的打印正在截断精度并显示出近似值。
您可以证明这一点:
pd.set_option('precision', 20)
然后查看mySeries。
0 16.00000000000000000000
1 14.00000000000000000000
2 12.00000000000000000000
3 10.00000000000000000000
4 3.10000000000000008882
dtype: float64
编辑:
What every computer programmer should know about floating point arithmetic始终是一本好书。
编辑:
关于KeyError,我无法复制该问题。
>> x = pd.Series([16,14,12,10,3.1])
>> a = {x[i]: i for i in x.index}
>> a[x[4]]
4
>> a.keys()
[16.0, 10.0, 3.1000000000000001, 12.0, 14.0]
>> hash(x[4])
2093862195
>> hash(a.keys()[2])
2093862195
关于python - 将float分配为字典键会更改其精度(Python),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39901833/