Django / Python конвертируют float во время понимания списка - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть объект Django Queryset с именем data, содержащий строковые ключи и значения с плавающей запятой.

Я хочу преобразовать все числа с плавающей запятой в 2 десятичных знака.

Если я сделаю это:

>>> param1_values = [d[param1] for d in data]
>>> param1_values[:5]
[26.1, 24.6, 26.2444444444444, 27.3103448275862, 26.7576923076923]

... это нормально, но мне нужно перевести в два знака после запятой.

Однако, если я сделаю это:

>>> param1_values = ["%.2f" % d['mean_air_temp'] for d in data]
>>> param1_values[:5]
['26.10', '24.60', '26.24', '27.31', '26.76']

Числа - то, что я хотел, но они преобразованы в строки! Почему это происходит и как мне это решить?

Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Вы можете использовать встроенную функцию round:

param1_values = [round(d[param1], 2) for d in data]

Примечание. Поведение функции round () для float может быть неожиданным: Например, раунд (2,675, 2) дает 2,67 вместо ожидаемых 2,68. это это не ошибка: это результат того факта, что большинство десятичных дробей не может быть представлен точно как поплавок. См с плавающей точкой Арифметика: проблемы и ограничения для получения дополнительной информации.

Кажется, это достаточно точно для вашего случая использования. Если вам нужен более точный ответ, посмотрите ответ Игнасио с использованием десятичной дроби.

1 голос
/ 03 апреля 2012

Из-за неизбежных неточностей в представлении IEEE 754 с плавающей запятой , это невозможно решить, сохраняя их плавающими.

>>> l = [26.1, 24.6, 26.2444444444444, 27.3103448275862, 26.7576923076923]
>>> [decimal.Decimal(x).quantize(decimal.Decimal('0.1')) for x in l]
[Decimal('26.1'), Decimal('24.6'), Decimal('26.2'), Decimal('27.3'), Decimal('26.8')]

Соответствующее поле для использования в Django, если вы хотитехранить их DecimalField (если вы не используете SQLite, но это совсем другой котелок с рыбой).

0 голосов
/ 03 апреля 2012

Вам действительно нужны округленные значения, или вы просто хотите отобразить два значения после десятичной точки при отображении значений в шаблоне?Если вы работаете с проблемой отображения, используйте фильтр 'floatformat' .Опять же, если это то, что вы пытаетесь достичь, я полагаю, что при просмотре списка вы можете использовать «listitem | floatformat: -2», чтобы получить желаемый результат.Если вместо этого вы хотите сохранить и использовать округленную версию в Python, у вас будет нелегкое время .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...