Я получаю цифры вроде
2.36363636363636
4.567563
1.234566465448465
10.5857447736
Как я могу заставить Ruby округлить эти числа вверх (или вниз) до ближайшего 0,05?
Я получаю цифры вроде
2.36363636363636
4.567563
1.234566465448465
10.5857447736
Как я могу заставить Ruby округлить эти числа вверх (или вниз) до ближайшего 0,05?
Проверьте эту ссылку, я думаю, что вам нужно. Рубиновое округление
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
[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]
В целом алгоритм "округления до ближайшего 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, поэтому синтаксис может быть неправильным, но я уверен, что вы можете понять это.
менее точный, но этот метод - это то, что большинство людей приходят на эту страницу для
(5.65235534).round(2)
#=> 5.65
Здесь общая функция, которая округляет любое заданное значение шага:
место в lib:
lib/rounding.rb
class Numeric
# round a given number to the nearest step
def round_by(increment)
(self / increment).round * increment
end
end
и spec:
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)
НТН.
Возможно его круглые числа с помощью метода String
class %
.
Например
"%.2f" % 5.555555555
даст результат "5.56"
(строка).
Теперь 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
Чтобы получить результат округления без десятичных знаков, используйте Float.round
5.44.round
=> 5
5.54.round
=> 6