Ruby Rounding Convention
Я пытаюсь определить функцию, которая учитывает следующие условия округления (округление до ближайшего целого или десятого):
Основная проблема, которую я обнаружил, заключалась в округлении отрицательных чисел.
Вот моя реализация (извините за условную проверку, но это только для этого примера):
def convention_round(number, to_int = false)
if to_int
number.round
else
number.round(1)
end
end
convention_round(1.2234) # 1.2
convention_round(1.2234, true) # 1
convention_round(1.896) # 1.9
convention_round(1.896, true) # 2
convention_round(1.5) # 1.5
convention_round(1.5, true) # 2
convention_round(1.55) # 1.6
convention_round(1.55, true) # 2
convention_round(-1.2234) # -1.2
convention_round(-1.2234, true) # -1
convention_round(-1.896) # -1.9
convention_round(-1.2234, true) # -2
convention_round(-1.5) # -1.5
convention_round(-1.5, true) # -2 (Here I want rounded to -1)
convention_round(-1.55) # -1.6 (Here I want rounded to -1.5)
convention_round(-1.55, true) # -2
Я не уверен на 100%, как лучше всего округлить отрицательные числа.
Спасибо!
1 ответ
Из документов вы можете использовать Integer#round
(а также Float#round
) для этого, следующим образом:
def convention_round(number, precision = 0)
number.round(
precision,
half: (number.positive? ? :up : :down)
)
end
convention_round(1.4) #=> 1
convention_round(1.5) #=> 2
convention_round(1.55) #=> 2
convention_round(1.54, 1) #=> 1.5
convention_round(1.55, 1) #=> 1.6
convention_round(-1.4) #=> -1
convention_round(-1.5) #=> -1 # !!!
convention_round(-1.55) #=> -2
convention_round(-1.54, 1) #=> -1.55
convention_round(-1.55, 1) #=> -1.5 # !!!
Это не совсем та подпись метода, которую вы просили, но это более общая форма, поскольку вы можете указать произвольную точность.
Тем не менее, я хотел бы указать на иронию, что (несмотря на название метода) это не обычный способ округления чисел.
Существует несколько различных соглашений, все из которых (?) Поддерживаются базовой библиотекой ruby (см. Ссылку на документацию выше), но это не одно из них.