簡體   English   中英

Django / Python在列表理解期間轉換float

[英]Django/Python convert float during list comprehension

我有一個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']

數字是我想要的,但它們會轉換為字符串! 為什么會發生這種情況,我該如何解決?

任何幫助表示贊賞。

您可以使用內置的round函數:

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

注意:float()的round()行為可能令人驚訝:例如,round(2.675,2)給出2.67,而不是預期的2.68。 這不是錯誤:這是由於大多數十進制小數不能完全表示為浮點數的結果。 有關更多信息,請參見浮點算法:問題和限制

對於您的用例,這似乎足夠准確。 如果您需要更精確的答案,請使用十進制查看Ignacio的響應。

由於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,但這是另外一堆魚)。

您是否真的需要四舍五入的值,還是在模板中顯示值時只想在小數點后顯示兩個值? 如果您要處理顯示問題,請使用'floatformat'過濾器 同樣,如果這是您要完成的工作,我相信您在滾動列表時可以使用“ listitem | floatformat:-2”獲得所需的結果。 相反,如果您希望在Python中存儲和使用四舍五入的版本,您將不會很輕松

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM