繁体   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