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

时间:2015-01-07 10:10:53

标签: 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)

2 个答案:

答案 0 :(得分:1)

是的,你可以安全地使用整数;他们会根据需要被强制转移到Decimal个对象。

Decimal类实现了许多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(),只有在明确指示时才会浮动(仅用于丰富的比较,因此==<=等),其余的是明确拒绝。浮子不适合自动转换;如果允许隐式转换浮点数,那么在代码中引入错误就太容易了。

答案 1 :(得分:1)

是的,你可以,例如:

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会容易出错。