2009-08-28 2 views

ответ

20

Проверьте эту ссылку, я думаю, это то, что вам нужно. Ruby rounding

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 
+0

Спасибо за ссылку! методы работают отлично. – dotty

+8

Хорошая ссылка. Ответ был бы лучше с резюме, поэтому он может стоять на своем собственном, тем более, что связанный код не делает точно то, что ОП задает, т. Е. Округляется до ближайшего 0,05, но округляется до определенного десятичного знака. – tvanfosson

+3

И хуже того, b/c сообщение действительно перегружает встроенную рубиновую функцию round (число десятичных мест), это плохая идея. – Rob

21
[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] 
+0

Darn, вы избили меня пару секунд! +1 от меня, хотя у меня была небольшая разная версия. – Swanand

+0

Это не округляет UP до ближайшего 0.05 по запросу OP, 2.36 .... должно быть 2.40, а не 2.35. –

+1

@ Кристофер Мауджан Правда, но (несмотря на название) это не то, о чем попросил ОП. В теле вопроса говорится «вокруг этих чисел вверх (** или вниз **) до ** ближайшего ** 0,05". В любом случае, если вы хотите округлить, используйте 'ceil' вместо' round'. – sepp2k

18

В общем случае алгоритм «округления до ближайшего х» является:

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, хотя, так что синтаксис не может быть правильным, но я уверен, вы можете понять это.

+1

Для того чтобы получить десятичное деление на 20.0 -> round (x * 20)/20.0; – Irukandji

+3

Для рубина: '(7.125 * 20) .round/20.0 => 7.15' –

8

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

места в 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) 

hth.

11

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

(5.65235534).round(2) 
#=> 5.65 
+1

5.6355.round (2)! = 5.65, но TS хочет 5.65 –

+0

Это решение только округляет число до двух знаков после запятой, оно не возвращает округленное значение до ближайшего 0,05 по запросу. –

+0

в некотором смысле вы правы, я должен удалить этот ответ. Но на другом уровне это очень популярный вопрос, который связан с поисковыми запросами, где люди находят этот ответ полезным, поэтому я буду держать его видимым –

4

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

Например

"%.2f" % 5.555555555 

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

2

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

5.44.round 
=> 5 

5.54.round 
=> 6 
3

Рубин 2 теперь имеет круглую функцию:

# Ruby 2.3 
(2.5).round 
3 

# Ruby 2.4 
(2.5).round 
2 

Есть также варианты в рубине 2.4 как: :even, :up и :down e.г;

(4.5).round(half: :up) 
5