Подтвердить что ты не робот

To_d всегда возвращает 2 десятичных места в рубине

Я имею дело с валютами, и я хочу округлить число до двух знаков после запятой. Даже если число составляет 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
4b9b3361

Ответ 1

В дополнение к ответу mcfinnigan вы также можете использовать следующее, чтобы получить 2 десятичных знака

'%.2f' % 500 # "500.00"

Этот прецедент известен как оператор формата строки

Ответ 2

Поскольку вы используете 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"

Ответ 3

Вот подсказка. 500.00 представляет собой число 500.0

В частности, sprintf поможет вам:

irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"

Ответ 4

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

Вместо этого храните денежные значения в виде целых чисел (представляющих центы) или взгляните на гем money, который предоставляет множество полезных функций для работы с такими значениями.

Ответ 5

Требовалось округлить ВНИЗ.

Большинство других ответов от 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"