2013-03-27 55 views
0

我很困惑將Decimal值與Django Max聚合查詢集的值進行比較。當我期望它是真實的時候,比較結果是錯誤的,我不知道爲什麼。Django最大聚合比較問題

我得到這樣的查詢集:

prev_hourly_rate = PayRate.objects.filter(employee__exact=emp_pk).exclude(pk=pay_rate_id).aggregate(Max('hourlyRate')) 

返回

{'hourlyRate__max': Decimal('25.1234')} 

我想的是十進制值與另一個十進制值,25.1234(由變量小時表示),但是這回假。我做這樣的比較:

if prev_hourly_rate['hourlyRate__max'] == hr: 

if prev_hourly_rate['hourlyRate__max'] == Decimal(hr): 

甚至

if prev_hourly_rate['hourlyRate__max'] == Decimal.from_float(hr): 

,它始終返回False。我顯然錯過了一些非常簡單的事情。請指出我疲倦的大腦是什麼。謝謝。

+1

什麼是hr?如果它是浮動的,它可能不完全等同於25.1234。嘗試打印「十進制(小時)」的結果來查看。 – 2013-03-27 15:18:30

回答

1

你可能想看看this SO discussion更多的信息,但短期的版本是Decimal(hr) == Decimal('25.123400000000000176214598468504846096038818359375')

爲了創建一個小數你想要的精確值,你必須使用的字符串表示浮動。 prev_hourly_rate['hourlyRate__max'] == Decimal(repr(hr))應該讓你得到你想要的。

+0

事實上,這就是發生了什麼事。顯然,所有的小數不會相等。我也嘗試將兩個值都轉換爲浮點,並且這也起作用,但我最喜歡這個解決方案。謝謝! – Shawn 2013-03-27 19:48:13

+0

這完全正確;通過傳遞字符串或浮點數來創建小數。由於小數使用與浮點數不同的精度邏輯,傳遞浮點數會導致意外的行爲。 – Hamms 2013-03-27 19:49:17