编写一个python程序来计算给定交易的确切变化

Mat*_*ill 1 python python-2.7

我正在编写一个程序来计算客户交易的零钱,该程序还将准确地告诉收银员每个面额给客户多少(尽管它假设无限填充)。

似乎一切都井井有条,工作正常,除了几个例子,我不知道为什么。例如,当我输入 5.65 美元作为应付金额,输入 6.00 美元作为给定金额时,它计算的变化为:

1 x 0.2 美元

1 x 0.1 美元

2 x 0.02 美元

这显然是不对的。它似乎忽略了它需要返还 5 美分而不是 2 * 2 美分的事实。这里发生了什么?

这是我的源代码:

def change():
    due = float(raw_input("Amount Due: $"))
    paid = float(raw_input("Amount Paid: $"))
    change = float(paid - due)    

    print "\nChange due: $%.2f" % (change)
    print "\nHand the customer: "

    denom = (20.00, 10.00, 5.00, 2.00, 1.00, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01)
    change_due = [" "]*len(denom)

    amount = change

    while amount > 0:     

        for i in range(len(denom)):

            change_due[i] = int(amount/denom[i])
            amount = amount%denom[i]

            if change_due[i] > 0:
                print "\n" + str(change_due[i]) + " x " + "$" + str(denom[i])

        break

change()
Run Code Online (Sandbox Code Playgroud)

注意:仅使用 $ 符号是因为我无法弄清楚如何在 Python 中正确显示 £。所以我在“denom”元组中使用了英镑面额。

Pru*_*une 5

最重要的是,您正在对浮点数使用特定于整数的运算。大多数基数为 10 的小数不能完美地表示为二进制。将您的程序转换为整数便士(即所有金额乘以 100)。例如:

due = 595
paid = 600
change = paid - due

print "\nChange due: $%.2f" % (change)
print "\nHand the customer: "

denom = (2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1)
Run Code Online (Sandbox Code Playgroud)

这解决了我在你的程序中遇到的逻辑和计算问题。在您提供的情况下,您的程序试图为 0.049999987 磅之类的东西提供零钱——因此是一对 tuppence。