【问题标题】:Seeking Feedback, Infinite loop寻求反馈,无限循环
【发布时间】:2014-02-06 16:20:09
【问题描述】:

我正在练习一些新获得的技能,并希望在社区中获得对以下代码的一些反馈。

目标:创建一个简单的程序,通过解构找零的组成部分(美元、四分之一等),帮助想象中的收银员返还正确的找零。 我能想到的最好方法是使用带有嵌套 while 循环的 if 语句。

2 个问题:

1)。尽管条件 runningTotal != change 不再满足,while 循环并未在脚本末尾终止。为什么会这样?是不是应该在满足该条件之前运行while,然后终止?我一定是遗漏了什么……你们有什么明显的遗漏吗?

2)。我仍然是一个初学者(你可能会说)。您对下面的脚本有什么反馈意见。我做的好、不好或只是一般想法的事情。我真的在努力变得更好,因此非常感谢您的 cmets。谢谢!

脚本:

def changeCalc(cost,pmt):
    change = float(pmt - cost)
    print("Total Change: " + str(change))
    runningTotal = 0 #used to count up the change paid in the while loop below

    #make sure they paid enough
    if (pmt - cost) < 0:
        print("The customer needs to pay " + str(abs(change)) + " more.")
    else:
        #check to see if any change is due
        while runningTotal != change:
            #how many DOLLAR bills to return
            dollarBills = int(change - runningTotal)
            print("Number of Dollar Bills: " + str(dollarBills))

            #add to runningTotal
            runningTotal = float(runningTotal + dollarBills)
            print runningTotal

            #how many QUARTERS to return
            numOFqtrs = int((change - runningTotal)/(.25))
            print("Number of Quarters: " + str(numOFqtrs))

            #add to running total
            runningTotal = float(runningTotal + (numOFqtrs * (.25)))
            print runningTotal

            #how many DIMES
            numOFdimes = int((change - runningTotal)/(.10))
            print("Number of Dimes: " + str(numOFdimes))
            runningTotal = float(runningTotal + (numOFdimes * (.10)))

            #how many NICKELS
            print runningTotal
            numOFnickels = int((change - runningTotal)/(.05))
            print("Number of nickels: " + str(numOFnickels))
            runningTotal = float(runningTotal + (numOFnickels * (.05)))
            print runningTotal

            #how many PENNIES
            numOFpennies = int((change - runningTotal)/(.01))
            print("Number of Pennies: " + str(numOFpennies))
            runningTotal = float(runningTotal + (numOFpennies * (.01)))

            print runningTotal
            print change
            #####WHY DOES THE LOOP NOT END HERE??????????##########

            break

运行 changeCalc(87.63,103.86) 导致无限循环,输出如下。

Total Change: 16.23
Number of Dollar Bills: 16
16.0
Number of Quarters: 0
16.0
Number of Dimes: 2
16.2
Number of nickels: 0
16.2
Number of Pennies: 3
16.23
16.23

【问题讨论】:

  • 用浮点数检查是否相等通常是不好的,特别是对于无法准确表示的 1/10。也许考虑使用整数表示美分,而不是使用浮点数表示美元。
  • 或者你可以使用十进制docs.python.org/2/library/decimal.html

标签: python while-loop infinite-loop


【解决方案1】:

正如其他人所指出的,while 循环的问题在于浮点精度:runningTotal 非常接近,但与change 不太一样。您可以通过使用一些小的 epsilon 进行比较或使用整数或类似的方法来解决此问题。

但是,您似乎根本不需要 while 循环,是吗?另外请注意,不同类型硬币的代码都是相同的,因此您可以使用循环来迭代所有不同类型的硬币:

COINS = (("Dollars", 1.), 
         ("Quarters", .25), 
         ("Dimes",    .10), 
         ("Nickels",  .05), 
         ("Pennies",  .01))

def changeCalc(cost, pmt):
    change = pmt - cost
    print("Total Change: %.2f" % change)
    if (pmt - cost) < 0:
        print("The customer needs to pay %.2f more." % abs(change))
    else:
        runningTotal = 0
        for (name, value) in COINS:
            number = int((change - runningTotal) / value)
            if number > 0:
                print("Number of %s: %d" % (name, number))
                runningTotal += number * value
        print runningTotal, change, (runningTotal - change)

【讨论】:

    【解决方案2】:

    尝试打印 change-runningTotal ,您会看到它的数量级为 10e-15 。这可能是由于使用了浮点数。 您可以将循环的条件更改为:
    “在 runningTotal - 更改 0.001:”
    让程序运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2021-11-11
      • 2015-04-12
      • 1970-01-01
      • 2018-10-27
      • 2010-12-09
      相关资源
      最近更新 更多