Использование:
>>> from __future__ import division # This is only needed on Python 2
>>> def round_to_nearest(n, m):
r = n % m
return n + m - r if r + r >= m else n - r
...
Он не использует умножение и не будет преобразовывать из / в числа с плавающей запятой.
Округление до ближайшего кратного 10:
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 10)))
-21 => -20
-18 => -20
-15 => -10
-12 => -10
-9 => -10
-6 => -10
-3 => 0
0 => 0
3 => 0
6 => 10
9 => 10
12 => 10
15 => 20
18 => 20
21 => 20
24 => 20
27 => 30
Как видите, он работает как для отрицательных, так и для положительных чисел. Галстуки (например, -15 и 15) всегда будут округлены вверх.
Аналогичный пример, который округляет до ближайшего кратного 5, демонстрируя, что он также ведет себя, как и ожидалось, для другой "базы":
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 5)))
-21 => -20
-18 => -20
-15 => -15
-12 => -10
-9 => -10
-6 => -5
-3 => -5
0 => 0
3 => 5
6 => 5
9 => 10
12 => 10
15 => 15
18 => 20
21 => 20
24 => 25
27 => 25