我使用此解决方案中的代码迭代小数点间隔:https://stackoverflow.com/a/13286671/2169327
def seq(start, end, step):
assert(step != 0)
sample_count = abs(end - start) / step
return itertools.islice(itertools.count(start, step), sample_count)
但我有一个问题。我的步长约为0.001,而我的间隔为70.390829到70.855549。如何确保我实际上尽可能多地迭代?我是否应该向下舍入到三位小数,以确保我尽可能多地获得该区域?有了这个,我的意思是我需要从接近开始开始,并尽可能接近结束。那会有帮助吗?还有其他聪明的想法吗?
答案 0 :(得分:3)
您可以使用numpy.linspace
,它会在给定的时间间隔内返回均匀间隔的值,您只需给它三个参数,即开始,停止和步数:
numpy.linspace(70.390829, 70.855549, 464)
在此范围内使用464个样本将接近0.001的步长,但linspace将保证您的第一个和最后一个值将完全等于您的开始和结束,因此涵盖整个范围。
答案 1 :(得分:3)
由于您似乎关注使用浮点数发生的舍入错误,因此以下代码使用decimal
模块允许您选择应用程序所需的精度:
>>> from decimal import Decimal as D
>>> compare = lambda a, b: (a > b) - (a < b)
>>> def drange(start, stop, step):
relation = compare(stop, start)
if not relation:
raise ValueError('start and stop may not have the same value')
if compare(relation, 0) != compare(step, 0):
raise ValueError('step will not allow the sequence to finish')
while True:
yield start
start += step
if compare(stop, start) != relation:
break
>>> sequence = tuple(drange(D('70.390829'), D('70.855549'), D('0.001')))
>>> len(sequence)
465
如果你不太担心浮点舍入错误,你也可以直接使用drange
生成器的数字,得到一个与小数完全相同的序列:
>>> sequence = tuple(drange(70.390829, 70.855549, 0.001))
>>> len(sequence)
465