我使用了“十进制”常量,以防万一。我可以安全地使用整数来安全地使用整数,比如整数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)
答案 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'
我认为这是个好消息,因为隐含地混合Decimal
和float
会容易出错。