2014-02-28 97 views
0

当我尝试使用radius的值作为字典中的键时,出现错误信息KeyError: 0.73780000000000001(这是当前半径的值...请参阅下文): 代码看起来在某种程度上是这样的:python中浮点数的位数问题

for n in range(len(myarray)): 
    radius = (np.sqrt(x[n]**2 + y[n]**2)) 

xy值是带有4位小数例如像花车:

-25.9166 71.0444 

我试图削减了小数的:

for n in range(len(myarray)): 
    radius = (int(np.sqrt(x[n]**2 + y[n]**2))*10000)/10000.0 

我不明白为什么它给我回个奇怪的值0.73780000000000001

+5

由于累积舍入误差,锁定浮点数不是一个好主意。请参阅[每位计算机科学家有关浮点运算的知识](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 –

+0

谢谢,但我不是计算机科学家,我只用python进行数据分析。你知道我怎么能解决这个问题? – user3041107

+1

你能否给我们更多关于你想要达到的内容的背景,以及你维护一个半径上的字典的目的是什么?可能有更好的方法来解决你的问题。 –

回答

3

首先,我真的不明白你的问题:

>>> (np.sqrt(x**2 + y**2)) 
75.623917690899873 
>>> (int(np.sqrt(x**2 + y**2))*10000)/10000.0 
75.0 

其次,作为@frederic -hamidi说,你应该了解更多关于浮点运算的知识,也被称为IEEE754 numbers,它们是这样构建的:

IEEE754 rep

这是构建基于二进制的“科学记数法”。关于这一点的好处是,它可以实现浮动的真正广泛的表达,坏处是您可能会遇到感觉不自然的近似值,但是因为它在二进制指数符号中是有意义的,而不是十进制表示形式。此外,您可能会得到如NaN(不是数字)或无穷大的值。

虽然您给我们的计算结果不给0.73780000000000001,但这个数字正是您在IEEE754计算中可以得到的近似值。 (虽然我不会了解如何得到它)

最后,你不应该使用浮点数作为键。相反,使用整数表示你可以使用:

>>> (int(np.sqrt(x**2 + y**2))*10000)/10000 
75 

通过对最后分数去掉.0,所以你不提倡左侧整数浮动。