2015-08-03 71 views
0

我想測試一組3個變量w1,w2,w3。當這些總和等於1時,我想要打印"YATTA"使用float(numpy)添加float的問題

import numpy as np 

for w1 in np.arange(0.10,0.45,0.05): 
     for w2 in np.arange(0.10,0.45,0.05): 
      for w3 in np.arange(0.10,0.45,0.05): 
       sumw=w1+w2+w3 
       if(sumw==1.0): 
        print "YATTA" 
       else: 
        print w1,w2,w3,sumw 

當我運行這個,我觀察到一些非常奇怪的事情!例如,當我的變量是:

w1 = 0.2 
w2 = 0.4 
w3 = 0.4 

sumw是1.0 它不打印"YATTA",而是執行else聲明。

爲什麼我的代碼的行爲如何,我該如何解決這個問題?

+2

[歡迎浮點運算的世界。(http://docs.oracle .com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

這必須是重複的,類似的問題會一直被問到。 –

回答

3

看起來你已經陷入了浮點運算不確切的事實。

請參閱this question爲什麼你要得到你的結果很好的解釋。

快速您的具體情況的解釋是,您的小數不能完全轉換爲二進制,所以w1,w2和w3不完全是您認爲他們是。更一般地說:大多數實數不能用有限的數字表示,大多數浮點運算必須舍入。

作爲一個解決方法,而不是平等比較花車,你現在所做的,而不是使用np.isclose功能,而不是

np.isclose(sumw, 1.0)