Как использовать десятичное значение шага ()? - PullRequest
623 голосов
/ 25 января 2009

Есть ли способ перейти между 0 и 1 на 0,1?

Я думал, что смогу сделать это следующим образом, но это не удалось:

for i in range(0, 1, 0.1):
    print i

Вместо этого он говорит, что аргумент шага не может быть нулем, чего я не ожидал.

Ответы [ 33 ]

0 голосов
/ 11 октября 2013

Я только новичок, но у меня была такая же проблема при моделировании некоторых вычислений. Вот как я пытался решить эту проблему, которая, кажется, работает с десятичными шагами.

Я также довольно ленив, и поэтому мне было сложно написать свою собственную функцию диапазона.

По сути, я изменил xrange(0.0, 1.0, 0.01) на xrange(0, 100, 1) и использовал деление на 100.0 внутри цикла. Меня также беспокоило, будут ли ошибки округления. Поэтому я решил проверить, есть ли такие. Теперь я слышал, что если, например, 0.01 из расчета не совсем поплавок 0.01, сравнение их должно возвращать False (если я ошибаюсь, пожалуйста, дайте мне знать).

Поэтому я решил проверить, будет ли мое решение работать для моего диапазона, выполнив короткий тест:

for d100 in xrange(0, 100, 1):
    d = d100 / 100.0
    fl = float("0.00"[:4 - len(str(d100))] + str(d100))
    print d, "=", fl , d == fl

И это напечатало True для каждого.

Теперь, если я все понял неправильно, пожалуйста, дайте мне знать.

0 голосов
/ 05 февраля 2019

Многие решения здесь по-прежнему имели ошибки с плавающей запятой в Python 3.6 и не делали именно то, что мне лично нужно.

Функция ниже принимает целые числа или числа с плавающей запятой, не требует импорта и не возвращает ошибок с плавающей запятой.

def frange(x, y, step):
    if int(x + y + step) == (x + y + step):
        r = list(range(int(x), int(y), int(step)))
    else:
        f = 10 ** (len(str(step)) - str(step).find('.') - 1)
        rf = list(range(int(x * f), int(y * f), int(step * f)))
        r = [i / f for i in rf]

    return r
0 голосов
/ 20 ноября 2013

Этот лайнер не будет загромождать ваш код. Знак параметра step важен.

def frange(start, stop, step):
    return [x*step+start for x in range(0,round(abs((stop-start)/step)+0.5001),
        int((stop-start)/step<0)*-2+1)]
...