[英]Python “decimal” package gives wrong results
我試圖通過設置getcontext().prec = 800
來計算以下內容。
>>> from decimal import *
>>> getcontext().prec = 800
>>> Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 )
Decimal('1.999999999999999988897769753748434595763683319091796875')
>>>
但預期結果是2
。 我在哪里做錯了?
prec
屬性定義了小數點后有多少個數字會將您的數字四舍五入。 例如,如果您期望2.00
,它的值應該是3
。 或者,如果您想對數字進行四舍五入,使其沒有小數位,您可以使用1
作為參數。
from decimal import *
getcontext().prec = 1
print(Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 ))
>> 2
當您從浮點數構造 Decimal 時,您會得到浮點數的確切值,這可能與十進制值不完全匹配,因為浮點數就是這樣工作的。
如果要進行精確的十進制運算,請從字符串而不是浮點數構造 Decimal 對象:
>>> Decimal('22.0') / Decimal('10.0') - Decimal('0.2')
Decimal('2.0')
似乎您必須將數字作為字符串提供,以防止它們被評估為浮點數。
from decimal import *
getcontext().prec = 800
print(Decimal(0.2))
print(Decimal('0.2'))
print(Decimal('22.0') / Decimal ('10.0') - Decimal ('0.2' ))
這使
0.200000000000000011102230246251565404236316680908203125
0.2
2.0
將字符串傳遞給 Decimal 構造函數而不是浮點數: Decimal('0.2')
給出您期望的結果, Decimal(0.2)
沒有。
這是因為:
如果 value 是浮點數,則二進制浮點值將無損轉換為其精確的十進制等效值。 這種轉換通常需要 53 位或更多位的精度。 例如,Decimal(float('1.1')) 轉換為 Decimal('1.100000000000000088817841970012523233890533447265625')。
https://docs.python.org/3/library/decimal.html#decimal.Decimal
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.