Я получаю номера типаВокруг рубина всплывают вверх или вниз до ближайших 0,05
2.36363636363636
4.567563
1.234566465448465
10.5857447736
Как бы я получить рубин округлить эти цифры вверх (или вниз) до ближайшего 0,05?
Я получаю номера типаВокруг рубина всплывают вверх или вниз до ближайших 0,05
2.36363636363636
4.567563
1.234566465448465
10.5857447736
Как бы я получить рубин округлить эти цифры вверх (или вниз) до ближайшего 0,05?
Проверьте эту ссылку, я думаю, это то, что вам нужно. 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
Спасибо за ссылку! методы работают отлично. – dotty
Хорошая ссылка. Ответ был бы лучше с резюме, поэтому он может стоять на своем собственном, тем более, что связанный код не делает точно то, что ОП задает, т. Е. Округляется до ближайшего 0,05, но округляется до определенного десятичного знака. – tvanfosson
И хуже того, b/c сообщение действительно перегружает встроенную рубиновую функцию round (число десятичных мест), это плохая идея. – Rob
[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]
Darn, вы избили меня пару секунд! +1 от меня, хотя у меня была небольшая разная версия. – Swanand
Это не округляет UP до ближайшего 0.05 по запросу OP, 2.36 .... должно быть 2.40, а не 2.35. –
@ Кристофер Мауджан Правда, но (несмотря на название) это не то, о чем попросил ОП. В теле вопроса говорится «вокруг этих чисел вверх (** или вниз **) до ** ближайшего ** 0,05". В любом случае, если вы хотите округлить, используйте 'ceil' вместо' round'. – sepp2k
В общем случае алгоритм «округления до ближайшего х» является:
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, хотя, так что синтаксис не может быть правильным, но я уверен, вы можете понять это.
Для того чтобы получить десятичное деление на 20.0 -> round (x * 20)/20.0; – Irukandji
Для рубина: '(7.125 * 20) .round/20.0 => 7.15' –
Вот общая функция, которая округляет любое заданное значение шага:
места в 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.
менее точен, но этот метод является то, что большинство людей прибегая к помощи этой странице
(5.65235534).round(2)
#=> 5.65
5.6355.round (2)! = 5.65, но TS хочет 5.65 –
Это решение только округляет число до двух знаков после запятой, оно не возвращает округленное значение до ближайшего 0,05 по запросу. –
в некотором смысле вы правы, я должен удалить этот ответ. Но на другом уровне это очень популярный вопрос, который связан с поисковыми запросами, где люди находят этот ответ полезным, поэтому я буду держать его видимым –
Можно округлить число с %
методом String
класса.
Например
"%.2f" % 5.555555555
"5.56"
даст в качестве результата (строку).
Чтобы получить округление результата без десятичных знаков, используйте Float's .round
5.44.round
=> 5
5.54.round
=> 6
Рубин 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
Вы понимаете, что это не целые числа, не так ли? –