1. ホーム
  2. python

[解決済み] range() フロート用

2022-04-20 01:48:05

質問

はあるのでしょうか? range() Pythonのfloatに相当するものですか?

>>> range(0.5,5,1.5)
[0, 1, 2, 3, 4]
>>> range(0.5,5,0.5)

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    range(0.5,5,0.5)
ValueError: range() step argument must not be zero

解決方法は?

<ストライク ビルトイン関数を知らないのですが、[this](https://stackoverflow.com/a/477610/623735)のような書き方をすれば、それほど複雑にはならないはずです。
def frange(x, y, jump):
  while x < y:
    yield x
    x += jump

---

コメントにもあるように、これでは、次のような予測できない結果が出る可能性があります。

>>> list(frange(0, 100, 0.1))[-1]
99.9999999999986

期待通りの結果を得るには、この質問の他の回答のいずれかを使用するか、@Tadhgが言及したように、次のようにします。 decimal.Decimaljump 引数で指定します。初期化はfloatではなく、必ずstringで行ってください。

>>> import decimal
>>> list(frange(0, 100, decimal.Decimal('0.1')))[-1]
Decimal('99.9')

あるいは、さらに

import decimal

def drange(x, y, jump):
  while x < y:
    yield float(x)
    x += decimal.Decimal(jump)

そして

>>> list(drange(0, 100, '0.1'))[-1]
99.9

[エディターズノット: もし、ポジティブな jump と整数のスタートとストップ ( xy ) であれば、問題なく動作します。より一般的な解決策としては こちら .]