Лучшая реализация Ruby с округлением до десятичной запятой - PullRequest
20 голосов
/ 01 октября 2010

Это кажется ужасно неэффективным. Может кто-нибудь дать мне лучший способ Руби.

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

Ответы [ 3 ]

32 голосов
/ 01 октября 2010
class Float
  def round_point5
    (self * 2).round / 2.0
  end
end

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

13 голосов
/ 01 октября 2010

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

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

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

(x * 2.0).round / 2.0

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

(x * notches).round / notches
1 голос
/ 28 марта 2017

Вы можете сделать это с помощью оператора modulo.

(x + (0.05 - (x % 0.05))).round(2)

Если x = 1234,56, возвращается 1234,6

Я наткнулся на этот ответ, потому что я пишу калькулятор на основе Ruby, и он использовал библиотеку Ruby's Money для выполнения всех финансовых расчетов. Объекты Ruby Money не имеют тех же функций округления, что и Integer или Float, но они могут возвращать остаток (например, по модулю, %).

Следовательно, используя Ruby Money, вы можете округлить объект Money до ближайших 25 долларов с помощью следующего:

x + (Money.new(2500) - (x % Money.new(2500)))

Здесь, если x = $ 1234,45 (<# Деньги дробные: 123445 валюта: доллар США>), он вернет $ 1250,00 (#

)

ПРИМЕЧАНИЕ. Нет необходимости округлять объекты Ruby Money, поскольку эта библиотека позаботится об этом за вас!

...