当我尝试将KeyError: 0.73780000000000001
的值用作字典中的键时,我收到错误消息radius
(这是当前半径的值...见下文):
代码看起来像这样:
for n in range(len(myarray)):
radius = (np.sqrt(x[n]**2 + y[n]**2))
x
和y
的值是带有四位小数的浮点数,例如:
-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
答案 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,它们就是这样构建的:
这是基于二进制的“科学记数法”的构建。关于它的好处是它能够实现真正广泛的浮点数表达式,坏的是你可能会遇到感觉不自然的近似值,但是因为它在二进制指数表示法中有意义,而不是十进制表示法。此外,您可能会获得NaN
(非数字)或无穷大等值。
虽然您给我们的计算没有给出0.73780000000000001
,但这个数字正是您可以通过IEEE754计算获得的近似值。 (虽然我不会深入了解一个人如何得到它)
最后你不应该使用浮子作为钥匙。相反,使用您可以使用的整数表示:
>>> (int(np.sqrt(x**2 + y**2))*10000)/10000
75
删除最后一个分数上的.0
,因此不要将左侧整数提升为浮动。