为什么我的范围功能打印未截断的浮动?

neb*_*ffa 1 python

我做了这个范围函数,所以我可以有一个整数步以外的东西,它可以工作,但我想知道为什么浮动不被截断.

def drange(start, step):
    values = []
    r = start
    while r >= 0:
        values.append(r)
        r += step
    return values


print drange(2, -0.2)
Run Code Online (Sandbox Code Playgroud)

经过调试,我发现不是这种打印

[2, 1.8, 1.6, 1.4, 1.2, 1.0, 0.8, 0.6, 0.4, 0.2, 0]
Run Code Online (Sandbox Code Playgroud)

而是打印

[2, 1.8, 1.6, 1.4000000000000001, 1.2000000000000002, 1.0000000000000002, 0.8000
000000000003, 0.6000000000000003, 0.4000000000000003, 0.2000000000000003, 2.7755
575615628914e-16]
Run Code Online (Sandbox Code Playgroud)

大声笑,难怪我的模块不起作用.为什么会发生这种情况,我该如何解决?

phi*_*hag 7

这是正确的行为,因为无法0.2 = 1/5在基数2中表达,就像1/3在基数10中无法表达一样.

decimal如果要在基数10中计算,请改用.

另外,你应该真正使用一个生成器,如

def drange(start, step):
    r = start
    while r >= 0:
        yield r
        r += step
print list(drange(2, -0.2))
Run Code Online (Sandbox Code Playgroud)

这允许用户drange迭代值而不为整个列表分配内存.