簡體   English   中英

Python “十進制” package 給出錯誤的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM