如何在python中获得小数精度?

day*_*mer 3 python floating-point

情况如下:

  • 我写一个单元测试,并比较了该是货币NUMERICPostgreSQL精确(10, 2)

test坚持认为

self.assertEquals(Decimal(89.12), user_two_transactions[0].amount)
Run Code Online (Sandbox Code Playgroud)

我失败了

AssertionError: Decimal('89.1200000000000045474735088646411895751953125') != Decimal('89.12')
Run Code Online (Sandbox Code Playgroud)

如何使其更精确并确保数量在数据库中正确保存?

Pav*_*sov 10

使用字符串初始化Decimal:

Decimal('89.12')
Run Code Online (Sandbox Code Playgroud)

如您所见,89.12不能完全表示为浮点数.

十进制结构文档.

你的另一个选择是一个(sign, digits, exponent)元组:

In [3]: Decimal((0, (8, 9, 1, 2), -2))
Out[3]: Decimal('89.12')
Run Code Online (Sandbox Code Playgroud)

但没有充分的理由请不要这样做:)