2012-04-03 57 views
0

我有一個名爲data的包含字符串鍵和浮點值的Django Queryset對象。Django/Python在列表理解期間轉換浮點數

我想將所有浮點數轉換爲小數點後兩位。

如果我這樣做:

>>> 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'] 

的數字是我想要的東西,但他們被轉換成字符串!爲什麼會發生這種情況,我該如何解決這個問題?

任何幫助表示讚賞。

+0

你想實現什麼?以圓整形式存儲數字的目的是什麼? – 2012-04-03 18:06:29

+0

在回答你的其他問題時,*爲什麼會發生這種情況?*,這是因爲當'%'運算符的第一個參數是一個字符串(''%.2f'')時,結果總是一個字符串,類似於用另一種語言如何使用'printf'。 – kojiro 2012-04-03 19:01:17

回答

4

您可以使用內置的round功能:

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

注:圓形的行爲()的花車,可奇怪:對於 例如,圓(2.675,2)給出了2.67代替的預期2.68。這 不是一個錯誤:這是由於大多數小數部分 不能完全表示爲浮點數。有關更多信息,請參閱Floating Point Arithmetic: Issues and Limitations

這似乎對您的使用情況足夠準確。如果您需要更精確的答案,請參閱使用Decimal的Ignacio's響應。

+0

不,你不能。但首先嚐試一下。 – 2012-04-03 18:02:39

+0

非常感謝! – 2012-04-03 18:03:08

+0

@ IgnacioVazquez-Abrams:爲什麼會這樣?像這樣的評論幾乎沒有幫助(即使它可能是正確的)。 – 2012-04-03 18:03:36

0

您是否真的需要四捨五入的值,還是僅僅希望在模板中顯示值時在小數點後面顯示兩個值?如果您正在處理顯示問題,請使用'floatformat' filter。再次,如果這是您要完成的任務,我相信當您瀏覽列表時,您可以使用「listitem | floatformat:-2」來獲得所需的結果。相反,如果您希望在Python中存儲和使用舍入版本,則需要not have an easy time of it

+0

只需重新閱讀原文,您可能需要「listitem | floatformat:2」。這將顯示小數點後的兩個值,即使兩者都爲零。如果需要描述四捨五入到小數點後兩位的全部值,原始數據中的'-2'選項將僅顯示小數點後的值。 – 2012-04-03 18:35:18

1

由於unavoidable inaccuracies in IEEE 754 floating point representation,這是不可能解決這個問題,同時保持他們漂浮。

>>> 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

+1:謝謝你回來,做這個。他想要小數點,所以它應該是'decimal.Decimal('0.01')' – sdolan 2012-04-03 21:26:50