Python 兑换计算器仅在需要一种硬币时工作
我目前正在尝试学习python,并且一直在进行/r/learnpython上的初学者项目。我对ChangeCalculator项目的想法是创建一个字典,其中包含“quarter”、“dime”、“nickel”和“penny”键,每个键的值都初始化为0。如下所示,我的代码似乎仅在我输入的更改只需要一种硬币类型时才起作用,即0.75-->三个四分之一硬币、0.1-->一个一角硬币等Python 兑换计算器仅在需要一种硬币时工作,python,python-2.7,Python,Python 2.7,我目前正在尝试学习python,并且一直在进行/r/learnpython上的初学者项目。我对ChangeCalculator项目的想法是创建一个字典,其中包含“quarter”、“dime”、“nickel”和“penny”键,每个键的值都初始化为0。如下所示,我的代码似乎仅在我输入的更改只需要一种硬币类型时才起作用,即0.75-->三个四分之一硬币、0.1-->一个一角硬币等 change_map = { 'quarter' : 0, 'dime' : 0, 'ni
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)
change\u map={
“四分之一”:0,
“一角”:0,
“镍”:0,
“penny”:0
}
def计算器(更改):
当更改>0时:
如果更改>=0.25:
变化-=0.25
更改_映射['quarter']+=1
elif变化<0.25且变化>=0.10:
变化-=0.10
更改映射['dime']+=1
elif变化<0.10且变化>=0.05:
变化-=0.05
更改地图['nickel']+=1
elif变化<0.05且变化>=0.01:
变化-=0.01
改变地图['penny']+=1
打印“您需要以下内容:”
打印更改地图
变更=原始输入(“请输入变更金额:”)
更改=浮动(更改)
计算器(更改)
我调试了你的代码,发现有一个无限循环。可能是因为浮点运算。您可以声明一个epsilon值,如
eps = 1e-2
和分别更改while循环
while change > eps
浮点算术错误
您的错误是由于。下面是当您输入一个值(如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)
此外,由于float将值存储为“0.0000000000 2”,并且您的程序没有else语句,因此您正在运行一个无限循环。在代码中添加else:break允许您运行0.76和其他值谢谢您的帮助!这是非常有见地的,这仍然有可能打破非常长的操作链。如果允许任意多个操作,则可以任意增大浮动误差。@OlivierMelançon这没有意义,因为他没有适当的“硬币”来增加误差much@Kirial科罗廖夫是我的意思的一个例子<代码>x=1000.01;当x>0:x-=0.25时,最终输出为
-0.2400000000000091
。现在把x放大<代码>x=10000.01;当x>0:x-=0.25时,最终输出现在是-0.2399999978172
。因此,通过增大初始值,误差会增大。特别是,通过选择一个足够大的x,我可以使错误超过你在答案中给出的界限。