0

所以我对 Python 很陌生,并且有一个关于四舍五入的问题。

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。我将不胜感激任何人提供的任何提示。再次感谢!

4

3 回答 3

2

不要round在小数上使用,round返回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)
于 2013-02-28T18:48:29.420 回答
1

round正在返回一个无法准确表示该数字的浮点数6.6。然后你将它与一个导致比较失败的字符串进行比较......(因为字符串和浮点数永远不会比较相等)

于 2013-02-28T18:48:32.230 回答
0

您正在比较一个字符串和一个浮点值。

你有两个选择:

  1. 格式total_tax也为字符串;这将自动将浮点值四舍五入到所需的位数:

    self.assertEqual(format(total_tax, '.02f'), '6.60')
    
  2. total_tax值与浮点文字进行比较,但有一个容差(因为浮点不精确):

    self.assertTrue((total_tax - 6.60) < 0.01)
    
于 2013-02-28T18:48:40.327 回答