Вокруг рубина плавать вверх или вниз до ближайшего 0,05 - PullRequest
25 голосов
/ 28 августа 2009

Я получаю числа типа

2.36363636363636
4.567563
1.234566465448465
10.5857447736

Как мне заставить Ruby округлять эти числа до (или уменьшать) с точностью до 0,05?

Ответы [ 9 ]

21 голосов
/ 28 августа 2009
[2.36363636363636, 4.567563, 1.23456646544846, 10.5857447736].map do |x|
  (x*20).round / 20.0
end
#=> [2.35, 4.55, 1.25, 10.6]
20 голосов
/ 28 августа 2009

Проверьте эту ссылку, я думаю, это то, что вам нужно. Рубиновое округление

class Float
  def round_to(x)
    (self * 10**x).round.to_f / 10**x
  end

  def ceil_to(x)
    (self * 10**x).ceil.to_f / 10**x
  end

  def floor_to(x)
    (self * 10**x).floor.to_f / 10**x
  end
end
18 голосов
/ 28 августа 2009

Обычно алгоритм «округления до ближайшего x » имеет вид:

round(x / precision)) * precision

Иногда лучше умножить на 1 / precision, потому что это целое число (и, следовательно, оно работает немного быстрее):

round(x * (1 / precision)) / (1 / precision)

В вашем случае это будет:

round(x * (1 / 0.05)) / (1 / 0.05)

который оценил бы:

round(x * 20) / 20;

Хотя я не знаю Python, поэтому синтаксис может быть неправильным, но я уверен, что вы можете понять это.

11 голосов
/ 28 февраля 2013

менее точно, но этот метод - то, что большинство людей ищет эту страницу для

(5.65235534).round(2)
#=> 5.65
8 голосов
/ 05 апреля 2012

Вот общая функция, которая округляется до любого заданного значения шага:

место в lib:

lib/rounding.rb
class Numeric
  # round a given number to the nearest step
  def round_by(increment)
    (self / increment).round * increment
  end
end

и спецификации:

require 'rounding'
describe 'nearest increment by 0.5' do
  {0=>0.0,0.5=>0.5,0.60=>0.5,0.75=>1.0, 1.0=>1.0, 1.25=>1.5, 1.5=>1.5}.each_pair do |val, rounded_val|
    it "#{val}.round_by(0.5) ==#{rounded_val}" do val.round_by(0.5).should == rounded_val end
  end
end

и использование:

require 'rounding'
2.36363636363636.round_by(0.05)

НТН.

4 голосов
/ 08 декабря 2016

Ruby 2 теперь имеет функцию округления:

# Ruby 2.3
(2.5).round
 3

# Ruby 2.4
(2.5).round
 2

Есть также опции в ruby ​​2.4, такие как: :even, :up и :down например,

(4.5).round(half: :up)
 5
4 голосов
/ 20 февраля 2014

Округлять числа можно методом String класса %.

Например

"%.2f" % 5.555555555

даст "5.56" как результат (строка).

2 голосов
/ 24 октября 2014

Чтобы получить результат округления без десятичных знаков, используйте Float's .round

5.44.round
=> 5

5.54.round
=> 6
0 голосов
/ 15 июня 2018

Я знаю, что вопрос старый, но я хотел бы поделиться своим изобретением с миром, чтобы помочь другим: это метод для округления числа с плавающей точкой с шагом, округления десятичной дроби до ближайшего заданного числа ; это полезно для округления цены продукта, например:

def round_with_step(value, rounding)
  decimals = rounding.to_i
  rounded_value = value.round(decimals)

  step_number = (rounding - rounding.to_i) * 10
  if step_number != 0
    step = step_number * 10**(0-decimals)
    rounded_value = ((value / step).round * step)
  end

  return (decimals > 0 ? "%.2f" : "%g") % rounded_value
end

# For example, the value is 234.567
#
# | ROUNDING | RETURN | STEP
# | 1        | 234.60 | 0.1
# | -1       | 230    | 10
# | 1.5      | 234.50 | 5 * 0.1 = 0.5
# | -1.5     | 250    | 5 * 10  = 50
# | 1.3      | 234.60 | 3 * 0.1 = 0.3
# | -1.3     | 240    | 3 * 10  = 30
...