2013-02-28 79 views
0

所以我對Python很新,並且有一個關於四捨五入的問題。Python v2.6向上舍入小數(貨幣)?

product_price = '79.98' 
subtotal = Decimal(product_price) 
cal_tax = '0.0825' 
tax_conv = Decimal(cal_tax) 
tax_total = subtotal * tax_conv 
total_tax = round(tax_total, 2) 
print total_tax 
self.assertEqual(total_tax, '6.60') 

total_tax返回6.6和斷言失敗:

AssertionError: u'6.60' != 6.5999999999999996 

我相信有一個新手的錯誤,我想提出。在這個例子中,我希望'total_tax'輪到我的斷言達到6.60。我會很感激任何人提供的提示。再次感謝!

回答

2

不要使用小數點上的roundround返回float。使用quantize

total_tax = tax_total.quantize(Decimal('0.01')) 

然後用另一Decimal進行比較:

self.assertEqual(total_tax, Decimal('6.60')) 

 

如果你想圓嚴格起來,量化是這樣的:

from decimal import Decimal, ROUND_UP 
total_tax = tax_total.quantize(Decimal('0.01'), rounding=ROUND_UP) 
+0

Huzzah !!非常感謝大家的回覆! – Josh 2013-02-28 19:09:09

1

round是返回floati ng點數不能準確表示數字6.6。然後你將它與一個使比較失敗的字符串進行比較......(因爲字符串和浮點數永遠不會相等)

0

您正在比較字符串和浮點值。

你有兩個選擇:

  1. 格式total_tax作爲一個字符串爲好;這將自動輪浮點值所需的位數:

    self.assertEqual(format(total_tax, '.02f'), '6.60') 
    
  2. 比較total_tax值與浮點字面代替,但有一個容差(因爲浮點是不準確):

    self.assertTrue((total_tax - 6.60) < 0.01)