Округление обычно выполняется для чисел с плавающей запятой, и здесь есть три основные функции, которые вы должны знать: round
(округление до ближайшего целого числа), math.floor
(всегда округляется в меньшую сторону) и math.ceil
(всегда округляется в большую сторону).
Вы спрашиваете о целых числах и округляете до сотен, но мы все равно можем использовать math.ceil
, пока ваши числаменьше чем 2 53 .Чтобы использовать math.ceil
, мы просто делим сначала на 100, округляем вверх и умножаем на 100 потом:
>>> import math
>>> def roundup(x):
... return int(math.ceil(x / 100.0)) * 100
...
>>> roundup(100)
100
>>> roundup(101)
200
Сначала делим на 100 и затем умножаем на 100, сдвигая два знака после запятой вправо иосталось так, что math.ceil
работает на сотни.Вы можете использовать 10**n
вместо 100, если хотите округлить до десятков (n = 1
), тысяч (n = 3
) и т. Д.
Альтернативный способ сделать это - избежать чисел с плавающей запятой (они имеют ограниченную точность) и вместо этого используют только целые числа.Целые числа имеют произвольную точность в Python, так что это позволяет округлять числа любого размера.Правило округления простое: найдите остаток после деления с 100 и добавьте 100 минус этот остаток, если он не равен нулю:
>>> def roundup(x):
... return x if x % 100 == 0 else x + 100 - x % 100
Это работает для чисел любого размера:
>>> roundup(100)
100
>>> roundup(130)
200
>>> roundup(1234567891234567891)
1234567891234567900L
Я выполнил мини-тестирование двух решений:
$ python -m timeit -s 'import math' -s 'x = 130' 'int(math.ceil(x/100.0)) * 100'
1000000 loops, best of 3: 0.364 usec per loop
$ python -m timeit -s 'x = 130' 'x if x % 100 == 0 else x + 100 - x % 100'
10000000 loops, best of 3: 0.162 usec per loop
Чистое целочисленное решение быстрее в два раза по сравнению с решением math.ceil
.
Томас предложил целочисленное решение, идентичное тому, которое у меня было выше, за исключением того, что оно использует хитрость путем умножения логических значений.Интересно заметить, что при написании кода таким способом нет преимущества в скорости:
$ python -m timeit -s 'x = 130' 'x + 100*(x%100>0) - x%100'
10000000 loops, best of 3: 0.167 usec per loop
В качестве последнего замечания позвольте мне также отметить, что если вы хотели округлить 101–149 до 100 иокругление 150–199 до 200, например, округление до ближайшего ста, тогда встроенная функция round
может сделать это для вас:
>>> int(round(130, -2))
100
>>> int(round(170, -2))
200