Реализуйте функцию, которая округляет число до ближайшего числа, которое делится на X - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующий код.

Реализация функции nearX, которая округляет число до ближайшего числа, которое делится на X. Например, если 13 округляется до ближайшего 5, оно округляется до 15. Если число находится точно между двумя возможными числами , он должен быть округлен в большую сторону.

def nearestX(num, x):
    if x == 0:
        return num
    remainder = abs(num % x)
    print(remainder)
    if remainder == 0:
        return num
    if num < 0:
        return -(abs(num) - remainder)
    else:
        return num + x - remainder

Но он не работает, например, для nearest(12,5), который должен дать 10, так как это ближе, чем 15, но вместо этого он возвращает 15.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Вы можете преобразовать данное число в объект decimal.Decimal, чтобы можно было указать тип округления на основе того, является ли число положительным или отрицательным при преобразовании его обратно в целое число с помощью метода to_integral_exact:

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
def nearestX(num, x):
    return (Decimal(num) / x).to_integral_exact(
        rounding=ROUND_HALF_DOWN if num < 0 else ROUND_HALF_UP) * x
0 голосов
/ 29 марта 2020

Обратите внимание, что nearestX(num, x) это либо x * (num // x), либо (x + 1) * (num // x). С учетом правила округления имеем:

def nearestX(num, x):
  d = num // x
  a = d * x
  b = a + x
  if b - num <= num - a:
    return b
  else:
    return a

например,

for i in range(10):
  print(i, nearestX(i, 3))
0 0
1 0
2 3
3 3
4 3
5 6
6 6
7 6
8 9
9 9
...