2013-02-28 81 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)