python中浮点数的位数问题

时间:2014-02-28 08:59:37

标签: python dictionary floating

当我尝试将KeyError: 0.73780000000000001的值用作字典中的键时,我收到错误消息radius(这是当前半径的值...见下文): 代码看起来像这样:

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

xy的值是带有四位小数的浮点数,例如:

-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

1 个答案:

答案 0 :(得分: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,因此不要将左侧整数提升为浮动。