2015-08-03 72 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)