我想使用浮动的内置范围功能,但显然它不起作用,并且通过快速研究,我明白没有内置选项,我和#39 ;我需要为此编写自己的函数。所以我做了:
def fltrange(mini, maxi, step):
lst = []
while mini < maxi:
lst.append(mini)
mini += step
return lst
rang = fltrange(-20.0, 20.1, 0.1)
print(rang)
input()
但这是我得到的: result
步骤应该只有0.1000000 ......,而是它(有时会改变)0.100000000000001。
提前致谢。
答案 0 :(得分:4)
有趣的事实:1/10不能用浮点数精确表示。您最接近的是0.1000000000000000055511151231257827021181583404541015625
。打印时最右边的数字通常会被遗漏,但它们仍然存在。这解释了错误的积累,因为你不断增加0.1s的总和。
您可以使用乘法方法而不是累积和来消除某些不准确性(但不是全部):
def fltrange(mini, maxi, step):
lst = []
width = maxi - mini
num_steps = int(width/step)
for i in range(num_steps):
lst.append(mini + i*step)
return lst
rang = fltrange(-20.0, 20.1, 0.1)
print(rang)
结果(为了清楚起见,我添加了换行符):
[-20.0, -19.9, -19.8, -19.7, -19.6, -19.5, -19.4, -19.3, -19.2, -19.1,
-19.0, -18.9, -18.8, -18.7, -18.6, -18.5, -18.4, -18.3, -18.2, -18.1,
-18.0, -17.9, -17.8, -17.7, -17.6, -17.5, -17.4, -17.3, -17.2, -17.1,
-17.0, -16.9, -16.8, -16.7, -16.6, -16.5, -16.4, -16.3, -16.2, -16.1,
-16.0, -15.899999999999999, -15.8, -15.7, -15.6, -15.5, -15.399999999999999, -15.3, -15.2, -15.1, -15.0,
...
19.1, 19.200000000000003, 19.300000000000004, 19.400000000000006, 19.5, 19.6, 19.700000000000003, 19.800000000000004, 19.900000000000006, 20.0]
答案 1 :(得分:1)
您可以使用numpy
。有一些功能可以满足您的需求。
import numpy as np # of course :)
np.linspace(1, 10, num=200)
array([ 1. , 1.04522613, 1.09045226, 1.13567839,
1.18090452, 1.22613065, 1.27135678, 1.31658291,
...
9.68341709, 9.72864322, 9.77386935, 9.81909548,
9.86432161, 9.90954774, 9.95477387, 10. ])
np.arange(1., 10., 0.1)
array([ 1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. ,
2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. , 3.1,
...
8.7, 8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7,
9.8, 9.9])
P.S。但是,它在技术上并不是一个生成器,它在Python3中是range(Python2.x的xrange)。