寻求反馈,无限循环

2024-04-19 02:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在练习一些新学到的技能,并想利用社区获得一些关于下面代码的反馈。你知道吗

目标:创建一个简单的程序来帮助一个假想的出纳通过解构零钱的组成部分(美元、四美元等)来返回正确的零钱。 我能想到的最好的方法是使用带有嵌套while循环的if语句。你知道吗

2个问题:

(1)。尽管条件runningTotal,while循环并没有在脚本末尾终止!=改变不再满足。这到底是为什么?while不是应该运行直到满足该条件,然后终止吗?我一定是漏掉了什么…有什么明显的我漏掉的东西你们看到了吗?你知道吗

(2)。我还是个初学者(你可能知道)。你对下面的剧本有什么反馈。我做得好,不好,或者只是一般的想法。我真的在努力让自己变得更好,所以非常感谢你的评论。谢谢!你知道吗

剧本:

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.63103.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

Tags: oftonumberiffloatchangemanyhow
2条回答

尝试打印change runningTotal,您将看到它的数量级为10e-15。这可能是由于使用了浮动。 您可以将循环的条件更改为:
“运行总计-更改<;-0.001或运行总计-更改>;0.001时:”
为了让程序正常工作。你知道吗

正如其他人所注意到的,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)

相关问题 更多 >