2015-01-07 66 views
0

我已經使用「十進制」常量,以防萬一。我是否可以安全地使用整數來達到同樣的目的,比如整數0和1?它用於存儲資金。我可以在Python的十進制計算中安全地使用int嗎?

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) 

回答

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

是的,你可以,例如:

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會太容易出錯。

相關問題