2017-05-08 39 views
0

我正在编写一个程序来计算客户交易的变化,它也会告诉收银员每个面额有多少交给客户(尽管它假设无限充满)。编写一个python程序来计算给定的交易确切的变化

它似乎都是为了和工作,除了一些例子,我不知道为什么。例如,当I型在$ 5.65作为应付金额和$ 6.00所给出的量,它计算的变化为:

1×$ 0.2

1×$ 0.1

2×$ 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() 

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

回答

4

最重要的是,您对浮点数使用整数特定的操作。大多数基数为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) 

这固定了我在程序中遇到的逻辑和计算问题。在你提供的情况下,你的程序试图给0.049999987镑这样的东西给予改变 - 因此是一对塔彭丝。

1

正如你现在知道浮点数不适合表示精确值。您也可以选择使用decimal模块,该模块可以精确地表示小数值,并且非常适合表示货币值。

from decimal import Decimal 

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

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

    denoms = map(Decimal, ('20.00', '10.00', '5.00', '2.00', '1.00', '0.50', '0.20', '0.10', '0.05', '0.02', '0.01')) 

    remain = change 

    for denom in denoms: 

     thisdenom, remain = divmod(remain, denom) 

     if thisdenom > 0: 
      print "\n%d x $ %s" % (thisdenom, str(denom)) 

change() 
相关问题