[英]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.