我可以在 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'
我认为这是个好消息,因为隐式混合 Decimal
和 float
太容易出错了。
为了以防万一,我使用了"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'
我认为这是个好消息,因为隐式混合 Decimal
和 float
太容易出错了。