python - 零钱计算器仅在需要一种硬币时才有效
问题描述
我目前正在尝试学习 python,并且一直在通过 /r/learnpython 上的初学者项目。我对零钱计算器项目的想法是创建一个包含键“四分之一”、“一角钱”、“镍”和“便士”的字典,每个键的值都初始化为 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)
推荐阅读
- php - json_decode:来自 HEREDOC 字符串的有效 JSON 的“语法错误”
- playframework - 如何在生产中服务新的公共资产?
- ruby-on-rails - 无法解析创建方法中的参数(文件上传)
- laravel - 使用 Eloquent 检索关系的关系
- css - 如何在引导程序中保持两列相互重叠,另一列保持在右侧?
- java - 在单行代码片段中写入和关闭 BufferedWriter
- python - DataError: (pyodbc.DataError) ('String data, right truncation: length 6454 buffer 6452', '22001') [SQL: u'INSERT INTO
- matplotlib - 绘制带有误差和能量的 RA/DEC 的设施
- c# - 如何从多个 SELECT 语句中获取数据并将其存储在 DataSet 中
- java - EBike 可以是 Bike 的子类