我可以在 Python 的 Decimal 计算中安全地使用 int 吗?

Can I safely use int in Decimal calculations in Python?

为了以防万一,我使用了"decimal"常量。我是否可以安全地出于相同目的使用整数,例如此处的整数 0 和 1?用来存钱的。

    if SOMETHING:
        invoice.tax_rate = Decimal(TAXRATE_STRING)
    else:
        invoice.tax_rate = Decimal("0.00")
    invoice.total_amount =\
        invoice.pretax_amount * (Decimal("1") + invoice.tax_rate)

是的,您可以安全地使用整数;他们将根据需要被强制使用 Decimal 个对象。

Decimal class 实现了很多 numeric emulation hooks 来做到这一点,包括 __r*__ 变体以确保即使整数是左-手操作数。

对于您的具体情况,如果税率设置为整数 0 并且您使用了整数 1,您将得到:

>>> from decimal import Decimal
>>> Decimal('20.00') * (1 + 0)
Decimal('20.00')

如果未设置为整数,则税率的总和会产生一个 Decimal 对象 0:

>>> 1 + Decimal('0.20')
Decimal('1.20')

等等

在内部,decimal._convert_other() function 用于处理强制转换。它总是将整数和长整数转换为 Decimal(),仅在明确指示时才浮动(仅用于丰富的比较,因此 ==<= 等),其余的被明确拒绝.浮点数不适合自动转换;如果允许隐式转换浮点数,则很容易在代码中引入错误。

可以,例如:

In [8]: d = decimal.Decimal("123.45")

In [9]: d / 10
Out[9]: Decimal('12.345')

请注意,这不适用于浮点值:

In [10]: d / 123.45
TypeError: unsupported operand type(s) for /: 'Decimal' and 'float'

我认为这是个好消息,因为隐式混合 Decimalfloat 太容易出错了。