嗨,我需要比較在我的項目浮點值我使用如下因素代碼如何在Django
if style_score.style_quiz_score ==float(17.40):
比較浮點值,但它不工作的這一點,但我從17.40的值更改爲17它工作正常,請告訴我如何比較浮點值
嗨,我需要比較在我的項目浮點值我使用如下因素代碼如何在Django
if style_score.style_quiz_score ==float(17.40):
比較浮點值,但它不工作的這一點,但我從17.40的值更改爲17它工作正常,請告訴我如何比較浮點值
這是因爲舍入誤差。決不==
比較浮,總是用這個模板:
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.75 = 1 + 0.5 + 0.25),則可以有精確的浮點數。但是,像0.1這樣的小數不能表示爲有限數字二進制分數的總和,因此浮點數很少。 – Inductiveload 2013-02-21 10:44:20
比較在python花車(或依賴於浮動的底層硬件表示任何語言)始終將是一個棘手的業務。最好的辦法是定義一個容差,在這個容差內你會認爲兩個數字是相等的(比如10^-6
),然後檢查數字之間的絕對差值是否小於你的容差。
代碼:
TOLERANCE=10**-6
def are_floats_equal(a,b):
return abs(a-b) <= TOLERANCE
PS:如果你真的真的想要精確,任意精度的,用你的浮點數運算,使用the decimal module。順便說一句,該頁面有一些很好的常規浮點失敗點的例子。但是,請注意,這比使用常規浮點數要慢得多,所以不要這樣做,除非你確實需要它。
什麼不工作?你有錯誤嗎?或者是其他錯誤? – Volatility 2013-02-21 10:34:55
它進入else條件,但我需要比較浮點值 – 2013-02-21 10:36:13
很難比較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