Я работаю над созданием отчета. Одна цифра в отчете должна быть выражена в миллионах. Я написал несколько базовых средств форматирования для обработки различных типов форматирования, которые должны быть согласованы по всему отчету. Для этого я использую лямбда-функции и форматирование строк. Две функции ниже. Один округлить, другой отформатировать.
formatter_round = lambda x: 0 if (x is None or x is bool) else round(x/1000000,1)
formatter_dollar = lambda x: '${:,.1}'.format(0) if (x is None or x == 0) else ('${:,.1}'.format(x) if x >= 0 else '$({:,.1})'.format(abs(x)))
Теперь приходит проблема. Смотрите мой пример ниже.
Я имею дело с двумя числами, a = 350000
и b = 850000
.
Для a
все работает так, как я ожидал. Число с плавающей запятой не всегда корректно при округлении (не «то, что я ожидал», а понятное поведение), но десятичная дробь верна.
a = 350000
formatter_dollar(formatter_round(a))
Out[89]: '$0.3'
a = Decimal(a)
formatter_dollar(formatter_round(a))
Out[91]: '$0.4'
Когда я запускаю тот же пример с b
, это не работает.
b = 850000
formatter_dollar(formatter_round(b))
Out[93]: '$0.8'
b = Decimal(b)
formatter_dollar(formatter_round(b))
Out[95]: '$0.8'
У меня вопрос: как правильно округлить и отобразить числа?
Я думал, что моя проблема связана с числами с плавающей запятой, и a
, кажется, подтверждает это. Затем, когда я запустил то же самое с b
, я понял, что это не так.