Python“decimal”包给出错误的结果
- 2025-04-15 09:21:00
- admin 原创
- 35
问题描述:
我尝试通过设置来计算以下内容getcontext().prec = 800
。
>>> from decimal import *
>>> getcontext().prec = 800
>>> Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 )
Decimal('1.999999999999999988897769753748434595763683319091796875')
>>>
但预期结果是2
。我哪里做错了?
解决方案 1:
当您从浮点数构造 Decimal 时,您会得到浮点数的精确值,该值可能与十进制值不完全匹配,因为这是浮点数的工作方式。
如果要进行精确的十进制运算,请使用字符串而不是浮点数构造 Decimal 对象:
>>> Decimal('22.0') / Decimal('10.0') - Decimal('0.2')
Decimal('2.0')
解决方案 2:
将字符串而不是浮点数传递给 Decimal 构造函数:Decimal('0.2')
给出了您期望的结果,Decimal(0.2)
但没有。
这是因为:
如果值为浮点数,则二进制浮点值会无损转换为其精确的十进制等效值。此转换通常需要 53 位或更高的精度。例如,Decimal(float('1.1')) 转换为 Decimal('1.100000000000000088817841970012523233890533447265625')。
https://docs.python.org/3/library/decimal.html#decimal.Decimal
解决方案 3:
看来您必须将数字作为字符串给出,以防止它们被评估为浮点数。
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
解决方案 4:
该prec
属性定义小数点后多少位数字会被四舍五入。例如,如果您期望2.00
,则其值应该是3
。或者,如果您想将数字四舍五入为不包含小数位,则可以将其用作1
参数。
from decimal import *
getcontext().prec = 1
print(Decimal(22.0) / Decimal ( 10.0) - Decimal ( 0.2 ))
>> 2
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD