Ответ 1
Как насчет объединения BigDecimal#truncate
и String#%
?
"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"
Я хочу преобразовать объект BigDecimal в значение валюты до двух знаков после запятой. Я не хочу округления. Как я могу это сделать?
Ни один из следующих подходов не работал:
v = BigDecimal("7.1762")
w = BigDecimal("4.2")
v.to_s('2F') # => "7.17 62"
v.to_s('F') # => "7.1762"
v.to_s('%0.2F') # => "0.71762E1"
v.to_s('%0.2f') # => "0.71762E1"
v.truncate(2).to_s('F') # => "7.17" # This one looks like it worked
w.truncate(2).to_s('F') # => "4.2" # But it doesn't pad with the trailing zero(es)
Как насчет объединения BigDecimal#truncate
и String#%
?
"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"
Простое форматирование с помощью '%.2f'
должно работать
v = BigDecimal("7.1233")
"%.2f" % v #=> "7.12"
v = BigDecimal("7.1")
"%.2f" % v #=> "7.10"
Было указано, что использование %.2f % v
приводит к тому, что v
преобразуется в число с плавающей запятой, вызывая потенциальную потерю точности/точности (например, "%.2f" % (10**24) == "999999999999999983222784.00"
)
В соответствии с комментарием falsetru на принятом ответе, вы можете использовать строку с помощью .to_s("F")
. Это возвращает число в формате фиксированной точки с десятичной точкой. Если вы добавите "00" в конец номера, вы можете удалить его с помощью регулярного выражения типа /.*\..{2}/
(любые символы, десятичная точка, а затем еще два символа), поэтому она сохраняет только две цифры после десятичной точки.
w = BigDecimal("4.2")
w.truncate(2).to_s("F") # => "4.2"
(w.truncate(2).to_s("F") + "00") # => "4.2000"
(w.truncate(2).to_s("F") + "00")[ /.*\..{2}/ ] # => "4.20"