更改计算器仅在需要一种类型的硬币时才有效

时间:2018-05-18 20:34:05

标签: python python-2.7

我目前正在尝试学习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)

2 个答案:

答案 0 :(得分:5)

浮点算术错误

您的错误是由float arithmetic error引起的。输入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)

答案 1 :(得分:2)

我调试了你的代码并注意到有一个无限循环。可能是因为漂浮算术。您可以声明像

这样的epsilon值
eps = 1e-2

分别改变while循环

while change > eps