Search code examples
pythonrangefractionsdecimal

range() for floats


Is there a range() equivalent for floats in Python?

>>> 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

Solution

  • I don't know a built-in function, but writing one like [this](https://stackoverflow.com/a/477610/623735) shouldn't be too complicated.
    def frange(x, y, jump):
      while x < y:
        yield x
        x += jump
    
    ---

    As the comments mention, this could produce unpredictable results like:

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

    To get the expected result, you can use one of the other answers in this question, or as @Tadhg mentioned, you can use decimal.Decimal as the jump argument. Make sure to initialize it with a string rather than a float.

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

    Or even:

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

    And then:

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

    [editor's not: if you only use positive jump and integer start and stop (x and y) , this works fine. For a more general solution see here.]