1

この範囲関数を作成して、整数ステップ以外のものを使用できるようにしましたが、機能しますが、なぜフロートが切り捨てられないのか疑問に思っています。

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]

笑、私のモジュールが機能していないのも不思議ではありません。なぜこれが起こり、どうすれば修正できますか?

4

1 に答える 1

7

基数 10 で0.2 = 1/5表現する方法がないように、基数 2 で表現することはできないため、これは正しい動作です。1/3

decimal基数 10 で計算する場合は、代わりに使用します。

さらに、次のように、実際にはジェネレーターを使用する必要があります。

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

これにより、ユーザーはdrange、リスト全体にメモリを割り当てることなく、値を反復処理できます。

于 2012-07-07T14:57:58.840 に答える