Ответ 1
В дополнение к ответу mcfinnigan вы также можете использовать следующее, чтобы получить 2 десятичных знака
'%.2f' % 500 # "500.00"
Этот прецедент известен как оператор формата строки
Я имею дело с валютами, и я хочу округлить число до двух знаков после запятой. Даже если число составляет 500,0, я бы хотел, чтобы оно составляло 500,00. Когда я делаю "500.00".to_d, он преобразует его в 500.0.
Каков хороший способ изменить это поведение? Я также использую этот метод, чтобы округлить до двух цифр и убедиться, что он всегда имеет 2 десятичных знака.
def self.round_down(x, n=2)
s = x.to_s
l = s.index('.') ? s.index('.') + 1 + n : s.length
s = s[0, l]
s = s.index('.') ? s.length - (s.index('.') + 1) == 1 ? s << '0' : s : s << '.00'
s.to_f
end
В дополнение к ответу mcfinnigan вы также можете использовать следующее, чтобы получить 2 десятичных знака
'%.2f' % 500 # "500.00"
Этот прецедент известен как оператор формата строки
Поскольку вы используете Rails, и это, похоже, связано с представлением, существует number_with_precision
:
number_with_precision(500, precision: 2)
#=> "500.00"
I18n.locale = :de
number_with_precision(500, precision: 2)
#=> "500,00"
Для валют я бы предложил number_to_currency
:
number_to_currency(500)
#=> "$500.00"
Вот подсказка. 500.00 представляет собой число 500.0
В частности, sprintf поможет вам:
irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"
Не используйте числа с плавающей запятой для представления денег. См. этот вопрос, чтобы узнать, почему это плохая идея.
Вместо этого храните денежные значения в виде целых чисел (представляющих центы) или взгляните на гем money, который предоставляет множество полезных функций для работы с такими значениями.
Требовалось округлить ВНИЗ.
Большинство других ответов от 500.016 до 500.02
Попробуйте:
def self.round_down(x, n = 2)
"%.#{n}f" % x.to_d.truncate(n)
end
irb(main):024:0> x=500.0; '%.2f' % x.to_d.truncate(2)
=> "500.00"
irb(main):025:0> x=500.016; '%.2f' % x.to_d.truncate(2)
=> "500.01"