Округление до 5 (или другого числа) в Python

Я настоятельно рекомендую не пытаться сделать это по нескольким причинам:

  • Совместимость с браузером. Хотя это возможно в нескольких браузерах, это невозможно в IE & lt; = 8.
  • Элементы DOM являются объектами хоста. Объекты-хосты (т. Е. Те, которые предоставляются средой, которые не являются собственными объектами JavaScript) не обязаны играть по тем же правилам, что и родные объекты JavaScript, и кроме указанного поведения DOM могут по существу делать то, что им нравится. Таким образом, даже если некоторые браузеры предоставляют прототип HTMLElement и позволяют увеличить его, нет никакой гарантии, что он будет работать так, как вы ожидаете.
  • Совместимость с другим кодом на вашей странице. Если какой-либо другой код на вашей странице (например, прототип) запутался с прототипом HTMLElement, вы рискуете назвать коллизии и трудно обнаруживаемые ошибки.

Вместо этого я бы предложил создать обертку объекты вокруг узлов DOM как jQuery, YUI и другие библиотеки.

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

140
задан Peter Mortensen 20 October 2018 в 00:08
поделиться

6 ответов

Я не знаю стандартной функции в Python, но у меня это работает:

Python 2

def myround(x, base=5):
    return int(base * round(float(x)/base))

Python3

def myround(x, base=5):
    return base * round(x/base)

Легко понять, почему это работает. Вы хотите убедиться, что ваше число, разделенное на 5, является целым числом, округленным правильно. Итак, сначала мы делаем именно это ( round (float (x) / 5) где float требуется только в Python2), а затем, поскольку мы разделили на 5, мы умножаем на 5 также. Последнее преобразование в int связано с тем, что round () возвращает значение с плавающей запятой в Python 2.

Я сделал функцию более универсальной, присвоив ей base , по умолчанию 5.

266
ответ дан 23 November 2019 в 22:33
поделиться

Для целых чисел и с Python 3:

def divround_down(value, step):
    return value//step*step


def divround_up(value, step):
    return (value+step-1)//step*step

Создание:

>>> [divround_down(x,5) for x in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [divround_up(x,5) for x in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]
0
ответ дан 23 November 2019 в 22:33
поделиться

А как насчет этого:

 def divround(value, step):
     return divmod(value, step)[0] * step
0
ответ дан 23 November 2019 в 22:33
поделиться

Это просто вопрос масштабирования

>>> a=[10,11,12,13,14,15,16,17,18,19,20]
>>> for b in a:
...     int(round(b/5.0)*5.0)
... 
10
10
10
15
15
15
15
15
20
20
20
20
ответ дан 23 November 2019 в 22:33
поделиться

round (x [, n]): значения округляются до ближайшего кратного 10 в степени минус n. Итак, если n отрицательно ...

def round5(x):
    return int(round(x*2, -1)) / 2

Поскольку 10 = 5 * 2, вы можете использовать целочисленное деление и умножение на 2, а не деление с плавающей запятой и умножение на 5,0. Не то чтобы это имеет большое значение, если вам не нравится сдвиг битов

def round5(x):
    return int(round(x << 1, -1)) >> 1
6
ответ дан 23 November 2019 в 22:33
поделиться

Модифицированная версия divround :-)

def divround(value, step, barrage):
    result, rest = divmod(value, step)
    return result*step if rest < barrage else (result+1)*step
3
ответ дан 23 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: