Python十进制范围()一步一步的值

时间:2016-01-02 03:33:55

标签: python

我想检查满足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

它正在运作,但没有给出所有组合。

1 个答案:

答案 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

这将安全地产生预期的输出。