我有一个浮点列表(实际上是一个 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/

10-11 04:01