Подтвердить что ты не робот

Лучшая реализация Ruby с округлением до десяти

Это кажется ужасным неэффективным. Может ли кто-нибудь дать мне лучший способ 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
4b9b3361

Ответ 1

class Float
  def round_point5
    (self * 2).round / 2.0
  end
end

Классическая проблема: это означает, что вы делаете целое округление с другим основанием. Вы можете заменить "2" на любой другой номер.

Ответ 2

Умножьте число на два.

округляется до целого числа.

Разделите на два.

(x * 2.0).round / 2.0

В обобщенной форме вы умножаетесь на количество вырезов, которые вы хотите на целое число (например, round to.2 - пять выемок на целое значение). Затем раунд; затем разделите на одно и то же значение.

(x * notches).round / notches

Ответ 3

Вы можете выполнить это с помощью оператора 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, так как эта библиотека позаботится об этом для вас!