我创建了这个范围函数,所以我可以有一个整数步以外的东西,它可以工作,但我想知道为什么浮动没有被截断。
def drange(start, step):
values = []
r = start
while r >= 0:
values.append(r)
r += step
return values
print drange(2, -0.2)
经过调试,我发现这不是打印
[2, 1.8, 1.6, 1.4, 1.2, 1.0, 0.8, 0.6, 0.4, 0.2, 0]
反而打印
[2, 1.8, 1.6, 1.4000000000000001, 1.2000000000000002, 1.0000000000000002, 0.8000
000000000003, 0.6000000000000003, 0.4000000000000003, 0.2000000000000003, 2.7755
575615628914e-16]
哈哈,难怪我的模块无法正常工作。为什么会发生这种情况,我该如何解决?
答案 0 :(得分:7)
这是正确的行为,因为无法在基数2中表达0.2 = 1/5
,就像无法在基数10中表达1/3
一样。
如果您想以10为基数进行计算,请使用decimal
。
此外,您应该使用生成器,如
def drange(start, step):
r = start
while r >= 0:
yield r
r += step
print list(drange(2, -0.2))
允许drange
的用户迭代值而不为整个列表分配内存。