将float指定为字典键会改变其精度(Python)

时间:2016-10-06 17:03:38

标签: python pandas dictionary floating-point

我有一个浮动列表(实际上它是一个pandas Series对象,如果它改变了什么),看起来像这样:

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?我想这与浮点数的表示方式有关(?),但为什么会发生现在,我该如何避免/修复呢?

编辑:如果此问题不准确,请随时为此问题提出更好的标题。

EDIT2:好的,所以它似乎是完全相同的数字,只是打印不同。但是,如果我将mySeries[26]指定为字典键,然后我尝试运行:

myDict[mySeries[26]]

我得到KeyError。什么是避免它的最好方法?

2 个答案:

答案 0 :(得分:6)

字典不会改变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

答案 1 :(得分:3)

该系列中的价值已经是这样了:

>>> x = pd.Series([16,14,12,10,3.1])
>>> x
0    16.0
1    14.0
2    12.0
3    10.0
4     3.1
dtype: float64
>>> x.iloc[4]
3.1000000000000001

这与浮点精度有关:

>>> np.float64(3.1)
3.1000000000000001

有关详情,请参阅Floating point precision in Python array

关于编辑中的KeyError,我无法重现。见下文:

>>> d = {x[i]:i for i in x.index}
>>> d
{16.0: 0, 10.0: 3, 12.0: 2, 14.0: 1, 3.1000000000000001: 4}
>>> x[4]
3.1000000000000001
>>> d[x[4]]
4

我怀疑KeyError来自SeriesmySeries[26]返回的是什么?