这里发生了什么?
In [86]: np.floor(10.0 * .91)
Out[86]: 9.0
In [87]: np.floor(10.0 * .91)/10.0
Out[87]: 0.90000000000000002
为什么不0.9
呢?
我想做这样的事情:
#create 2d bins
bins = {}
for x in np.arange(-1,1, 0.1):
for y in np.arange(-1,1, 0.1):
bins[(x,y)] = 0
#count number of occurences in each bin
for x,y in np.random.randn(10,2):
rounded = (np.floor(10.0 * x)/10.0, np.floor(10.0 * y)/10.0)
bins[(x,y)] += 1 # I get an error here
事实证明,float64
与Python的相比,numpy具有用于转换为字符串的不同算法float
。
当字符串0.90000000000000002和0.9解析为float64时,它们最终将具有相同的位模式。
您可以确认np.floor(10.0 * .91)/10.0 == 0.9
产量True
。
根本问题是,在将浮点数转换为字符串时,应指定多少个小数位?一些实现使用最小位数,以便将字符串解析为最接近的浮点值将产生相同的值。一些实现将为安全性提供额外的数字。
因为最终,float(“ 0.9”)实际上完全等于0.90000000000000002220446049250313080847263336181640625。所以从某种意义上说,两个答案都是正确的。
问答第二部分:您可以花时间弄清楚浮点的工作原理,也可以将整数存储桶用于字典。
换句话说,不是像这样-1.0, -0.9, -0.8, ..., 0.9
的键,而是像键一样-10, -9, -8, ..., 9
。它应该避免将来出现很多问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句