Python:程序在使用float时会不断进入无限循环

时间:2011-08-29 02:11:49

标签: python loops

这是我原来的工作计划:

def num_rushes(required_height, rush_height_gain, back_sliding):
    current_height = 0
    rushes = 0
    while current_height < required_height:
        rushes += 1
        current_height += rush_height_gain
        if current_height >= required_height:
            break
        else:
            current_height -= back_sliding
    return rushes

print num_rushes(100, 15, 7)

这个程序做了什么计算了多少&#34; rush&#34;只要我们达到所需的高度(required_height),每次急促(rush_height_gain)之后,我们都会退回给定的金额(back_sliding)。

我想要的是每次匆忙之后,乘以0.95的高度(我们每次失去5%的冲动)。

正如你在下面看到的,我所做的是将rush_height_gain转换为float,然后将行rush_height_gain *= 0.95添加到我的while循环中,但是由于某种原因,我似乎无法弄明白,我最终无限循环。

def num_rushes(required_height, rush_height_gain, back_sliding):
    current_height = 0
    rushes = 0
    rush_height_gain = float(rush_height_gain)
    while current_height < required_height:
        rushes += 1
        current_height += rush_height_gain
        if current_height >= required_height:
            break
        else:
            current_height -= back_sliding
        rush_height_gain *= 0.95
    return rushes

print num_rushes(100, 15, 7)

对于为什么会发生这种情况以及如何获得我想要的结果的任何帮助都将不胜感激。

干杯。

2 个答案:

答案 0 :(得分:7)

每次通过rush_high_gain时,

while-loop会变小。但back_sliding保持不变。如果通过循环(约15)进行了足够的传递,则rush_height_gain可能小于backsliding。此时current_height会越来越小,你永远不会退出循环。

答案 1 :(得分:2)

如果您在循环中临时添加print语句以在每次迭代时显示相关变量的值,您会看到,因为您不断缩小rush_height_gain,它最终会变得小于{{ 1}}。一旦发生这种情况,对象会向后滑动,而不是在每一步向上滑动,因此实际上失去高度。这意味着,如果到那时你还没有达到back_sliding,那么你永远不会。

最简单的解决方案可能是将您的循环条件更改为required_height变为否定时停止,或者current_height变得小于rush_height_gain。或者,您可以更改计算back_sliding的方式,使其永远不会低于rush_height_gain