我正在练习一些新获得的技能,并希望利用社区来获取有关以下代码的一些反馈。
目标:创建一个简单的程序,通过解构找零的组成部分(美元、25 美分等)来帮助想象中的收银员归还正确的找零。 我能想到的最好方法是使用带有嵌套 while 循环的 if 语句。
2 个问题:
1).尽管不再满足 runningTotal != change 条件,但 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.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
最佳答案
正如其他人所指出的,您的 while
循环的问题在于浮点精度:runningTotal
非常接近,但只是不太接近与更改
相同。您可以通过使用一些小的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)
关于python - 寻求反馈,无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21184157/