Ответ 1
class Float
def round_point5
(self * 2).round / 2.0
end
end
Классическая проблема: это означает, что вы делаете целое округление с другим основанием. Вы можете заменить "2" на любой другой номер.
Это кажется ужасным неэффективным. Может ли кто-нибудь дать мне лучший способ Ruby.
def round_value
x = (self.value*10).round/10.0 # rounds to two decimal places
r = x.modulo(x.floor) # finds remainder
f = x.floor
self.value = case
when r.between?(0, 0.25)
f
when r.between?(0.26, 0.75)
f+0.5
when r.between?(0.76, 0.99)
f+1.0
end
end
class Float
def round_point5
(self * 2).round / 2.0
end
end
Классическая проблема: это означает, что вы делаете целое округление с другим основанием. Вы можете заменить "2" на любой другой номер.
Умножьте число на два.
округляется до целого числа.
Разделите на два.
(x * 2.0).round / 2.0
В обобщенной форме вы умножаетесь на количество вырезов, которые вы хотите на целое число (например, round to.2 - пять выемок на целое значение). Затем раунд; затем разделите на одно и то же значение.
(x * notches).round / notches
Вы можете выполнить это с помощью оператора modulo
.
(x + (0.05 - (x % 0.05))).round(2)
Если x = 1234.56, это вернет 1234.6
Я наткнулся на этот ответ, потому что я пишу калькулятор на основе Ruby и использовал библиотеку Ruby Money для выполнения всех финансовых расчетов. Объекты Ruby Money не имеют одинаковых функций округления, которые выполняет Integer или Float, но они могут возвращать остаток (например, modulo, %
).
Следовательно, используя Ruby Money, вы можете округлить объект Money до ближайшего $25 со следующим:
x + (Money.new(2500) - (x % Money.new(2500)))
Здесь, если x = $1234,45 (< #Money fractional: 123445 currency: USD > ), тогда он вернет $1250,00 (#
ПРИМЕЧАНИЕ. Нет необходимости округлять объекты Ruby Money, так как эта библиотека позаботится об этом для вас!