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

文字列と浮動小数点値を比較しています。

次の 2 つのオプションがあります。

  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 に答える