首页 > 解决方案 > 输入整数时计算最小硬币数量的程序是正确的,但不是浮点数

问题描述

我有一个家庭作业,我必须编写一个程序,输出由使用最少硬币数量的自动售货机提供的零钱。例如,£3.67 可以分配为 1x£2 + 1x£1 + 1x50p + 1x10p + 1x5p + 1x2p。

例如,当我输入 230 而不是 2.3 时,该程序可以工作,但是当我在程序中输入 change=change*100 时(应该做同样的事情),我的答案不准确 - 可能是由于一些舍入错误。

change=float(input("Input change"))
(change=change*100)
denominations = [200, 100, 50, 20, 10, 5, 2, 1]
used = {x: 0 for x in denominations}

for val in denominations:
    used[val] += change // val
    change -= val * used[val]

print(used)

没有变化=变化* 100:

Input: 230
Output: {200: 1.0, 100: 0.0, 50: 0.0, 20: 1.0, 10: 1.0, 5: 0.0, 2: 0.0, 1: 0.0}
i.e. 230

更改=更改* 100:

Input: 2.3
Output: {200: 1.0, 100: 0.0, 50: 0.0, 20: 1.0, 10: 0.0, 5: 1.0, 2: 2.0, 1: 0.0}
i.e. 2.29 (and using far too many coins)

标签: python-3.x

解决方案


对于更高精度的十进制数学,您可以使用专用库

请试试这个:

from decimal import Decimal

change=Decimal(input("Input change"))
change=change*100
denominations = [200, 100, 50, 20, 10, 5, 2, 1]
used = {x: 0 for x in denominations}

for val in denominations:
    used[val] += int(change / val)
    change -= val * used[val]

print(used)
print("TOTAL:", sum([val * used[val] for val in denominations]))

注意:您的算法是贪心的,并且对当前denominations和世界上大多数硬币系统都是正确的,但并非总是如此。因此,如果作为作业的一部分,您可能会针对某些任意硬币系统进行测试 - 它可能不起作用(例如denominations = [240,60,30,24,12,6,3,1],您的答案48将是30+12+6而应该是24+24


推荐阅读