2017-07-19 30 views
1

我在程序中遇到了一些準確性問題,使用Decimal當提高到1的冪時,小數部分丟失精度。

一個簡單的攝製:

from decimal import Decimal 

print Decimal(1910944005427272400562113336049664) 
print Decimal(1910944005427272400562113336049664)**1 
print int(Decimal(1910944005427272400562113336049664)**1) 

給出:

1910944005427272400562113336049664 
1.910944005427272400562113336E+33 
1910944005427272400562113336000000 

正如你可以看到,原來的價值已成爲略小(減去49664確切地說)。

現在,我的實際代碼做的不僅僅是將數字提高到1的冪,所以我最終導致精度下降。

有沒有更好的Decimal在那裏我可以使用?

我的輸入和輸出在0(含)和2^256(不含)之間。

+1

您剛剛使用整數算術嗎? – Phylogenesis

+0

@Phylogenesis:不,它在標籤中提到,但我應該在問題本身中強調它。順便說一句,如果我只使用整數算術,那麼我不需要'Decimal'開頭,因爲Python支持256位整數算術。 – goodvibration

回答

3

the documentation所述,「十進制模塊具有用戶可改變的精確度(默認爲28個位置)」。您可以將精度設置爲更高的值以獲得準確的結果:

>>> decimal.getcontext().prec = 100 
>>> print(int(Decimal(1910944005427272400562113336049664)**Decimal(1))) 
1910944005427272400562113336049664 
+0

這是一個「全局」設置,還是我需要**每個** Decimal'實例? – goodvibration

+0

哦,全局的(從你的代碼中很明顯)。 – goodvibration

+0

'prec'的最大值是多少? – goodvibration