2013-02-21 61 views
0

嗨,我需要比較在我的項目浮點值我使用如下因素代碼如何在Django

if style_score.style_quiz_score ==float(17.40): 

比較浮點值,但它不工作的這一點,但我從17.40的值更改爲17它工作正常,請告訴我如何比較浮點值

+0

什麼不工作?你有錯誤嗎?或者是其他錯誤? – Volatility 2013-02-21 10:34:55

+0

它進入else條件,但我需要比較浮點值 – 2013-02-21 10:36:13

+3

很難比較Python中的浮點數:'17.10 + 0.30 == 17.40'返回'False'。你可以嘗試'如果abs(style_score.style_quiz_score - 17.40)<0.0001:'? – eumiro 2013-02-21 10:40:46

回答

2

這是因爲舍入誤差。決不==比較浮,總是用這個模板:

def floats_are_the_same(a,b): return abs(a-b) < 1e-6 

if floats_are_the_same(value, 17.4): 
    .... 

即檢查該值是接近到某一期望值。這是因爲浮動運算,這幾乎總是有舍入誤差:

>>> 17.1 + 0.3 
17.400000000000002 

參見:What is the best way to compare floats for almost-equality in Python?

+1

並不總是舍入誤差。浮點由比特組成,每個比特代表一個單元的兩倍小到左邊的一個單元,所有單元都取指數。因此,如果您有一個可以表示爲二進制分數總和的數字(例如1.75 = 1 + 0.5 + 0.25),則可以有精確的浮點數。但是,像0.1這樣的小數不能表示爲有限數字二進制分數的總和,因此浮點數很少。 – Inductiveload 2013-02-21 10:44:20

2

比較在python花車(或依賴於浮動的底層硬件表示任何語言)始終將是一個棘手的業務。最好的辦法是定義一個容差,在這個容差內你會認爲兩個數字是相等的(比如10^-6),然後檢查數字之間的絕對差值是否小於你的容差。

代碼:

TOLERANCE=10**-6 

def are_floats_equal(a,b): 
    return abs(a-b) <= TOLERANCE 

PS:如果你真的真的想要精確,任意精度的,用你的浮點數運算,使用the decimal module。順便說一句,該頁面有一些很好的常規浮點失敗點的例子。但是,請注意,這比使用常規浮點數要慢得多,所以不要這樣做,除非你確實需要它。