我想检查满足if语句
中给出的条件的所有组合值def drange(start, stop, step):
r = start
while r < stop:
yield r
r += step
for a in drange(0.1, 0.9,0.1):
for b in drange(0.1, 0.9,0.1):
for c in drange(0.1, 0.9,0.1):
if a+b+c == 1 and a>b>c:
print a
print b
print c
它正在运作,但没有给出所有组合。
答案 0 :(得分:4)
你在这里遇到的基本上是浮点运算背后的问题。请参阅this question for further information了解发生了什么以及发生的原因。
总结一下,只需查看drange(0.1, 0.9, 0.1)
:
>>> list(drange(0.1, 0.9, 0.1))
[0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999]
如您所见,您无法获得准确的结果。因此,当您总结它们时,您将无法得到确切的1
。
相反,在将浮点数与舍入数字进行比较时,应始终允许某种精度损失。一种方法是采取差异,看看它是否低于某个阈值(在这种情况下,我选择了0.00001
):
if abs((a + b + c) - 1) < 0.00001:
print('The sum is likely 1')
因此,在您的情况下,您的代码可能如下所示:
for a in drange(0.1, 0.9, 0.1):
for b in drange(0.1, 0.9, 0.1):
for c in drange(0.1, 0.9, 0.1):
if abs((a + b + c) - 1) < 0.00001 and a > b > c:
print a
print b
print c
这将安全地产生预期的输出。