簡體   English   中英

更改計算器僅在需要一種類型的硬幣時才有效

[英]Change calculator only works if one type of coin needed

我目前正在嘗試學習python並且已經在/ r / learnpython上進行了初學者項目。 我對更改計算器項目的想法是創建一個包含鍵'quarter','dime','nickel'和'penny'的字典,每個字符的值都初始化為0.我的代碼,如下所示,似乎只在改變我輸入只需要一種類型的硬幣,即0.75 - > 3季度,0.1 - > 1角錢等。

 change_map = {
    'quarter' : 0,
    'dime' : 0,
    'nickel' : 0,
    'penny' : 0
}

def calculator(change):
    while change > 0:
        if change >= 0.25:
            change -= 0.25
            change_map['quarter'] += 1
        elif change < 0.25 and change >= 0.10:
            change -= 0.10
            change_map['dime'] += 1
        elif change < 0.10 and change >= 0.05:
            change -= 0.05
            change_map['nickel'] += 1
        elif change < 0.05 and change >= 0.01:
            change -= 0.01
            change_map['penny'] += 1
    print "You need the following: "
    print change_map

change = raw_input("Please enter amount of change: ")
change = float(change)
calculator(change)

浮點算術錯誤

您的錯誤是由浮點算術錯誤引起的 輸入0.26的值時會出現這種情況。

change = 0.26
change  -= 0.25
change  -= 0.01
print (change) # 8.673617379884035e-18

由於最后一個change值大於0但小於0.01 ,因此輸入無限循環。

如何解決它

解決這個問題的一種方法是依靠精確算術,使用int而不是float來表示離散值,例如貨幣。 這意味着使你的基本單位成為美分而不是美元。

change_map = {
    'quarter' : 0,
    'dime' : 0,
    'nickel' : 0,
    'penny' : 0
}

def calculator(change):
    while change > 0:
        if change >= 25:
            change -= 25
            change_map['quarter'] += 1
        elif change >= 10:
            change -= 10
            change_map['dime'] += 1
        elif change >= 5:
            change -= 5
            change_map['nickel'] += 1
        else:
            change -= 1
            change_map['penny'] += 1

    print ("You need the following: ")
    print (change_map)

change = raw_input("Please enter amount of change: ")

# Here we convert the decimal value input by the user to cents
change = int(float(change) * 100)

calculator(change)

例:

Please enter amount of change: 0.26
You need the following: 
{'quarter': 1, 'dime': 0, 'nickel': 0, 'penny': 1}

改進

在一個側面說明,您可以通過使用提高你的解決方案dict值和名稱硬幣。 特別是,這允許您通過更新dict來擴展程序,而不必添加新的if語句。

這是一個增加美元作為變化的可能性的例子。

value_map = {
    100: 'dollar',
    25: 'quarter',
    10: 'dime',
    5: 'nickel',
    1: 'penny'
}

def calculator(change):
    change_map = {}

    for value in sorted(value_map, reverse=True):
        coin = value_map[value]
        change_map[coin], change = divmod(change, value)

    print ("You need the following: ")
    print (change_map)

change = raw_input("Please enter amount of change: ")

change = int(float(change) * 100)

calculator(change)

我調試了你的代碼並注意到有一個無限循環。 可能是因為漂浮算術。 您可以聲明像epsilon值

eps = 1e-2

並分別更改while循環

while change > eps

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM