2014-01-17 39 views
1

我正在練習一些新獲得的技能,並希望挖掘社區對下面代碼的一些反饋。尋求反饋,無限循環

目標:創建一個簡單的程序,通過解構變化的組成部分(美元,四肢等)來幫助想象中的收銀員恢復正確的變化。 我能想到做這件事的最好方法是使用帶有嵌套while循環的if語句。

2個問題:

1)。儘管條件runningTotal!= change不再滿足,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 
+2

通常不好檢查與浮點數,特別是1/10,這不能完全表示。也許考慮使用整數爲美分而不是浮動美元。 –

+1

或者您可以使用Decimal http://docs.python.org/2/library/decimal.html – M4rtini

回答

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) 
0

嘗試打印change-runningTotal,您會看到它的順序是10e-15。這很可能是由於使用浮標。 您可以將循環條件更改爲:
「while runningTotal - change < -0.001或runningTotal - change> 0.001:」
「以使程序生效。