2017-05-08 33 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() 
相關問題