Python的Decimal类是可变宽度的吗?

2022-04-10 00:00:00 python decimal precision

问题描述

在Python中,您可以拥有任意大的整数(尽管它可能会占用您所有的内存来存储它们)。另一方面,对于浮点数,它们最终会溢出,如果您试图用太多的小数点来计算浮点数,则会失去精度。

哪个是decimal.Decimal类?

我可以在小数点前有任意数量的数字吗?小数点后呢?限制是什么?


解决方案

Decimal具有用户指定的精度;您可以修改当前上下文以指定必须保留的小数位数。PERthe docs:

与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以根据给定问题的需要进行调整。

然后是一个示例:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')

如果您真的需要,可以将精度调到1,000,000或更高,但计算速度会很慢。在实践中,大多数问题都有一个不需要更多精度的点;NASA stops at 16 digits of pi (15 after the decimal) and at the scale of the entire solar system that has an error margin of only an inch or two for any calculations they care about;它们需要小数点左边更多的位来表示数值,但对于大多数目的,默认精度28就足够了,将其调高到40或50就应该涵盖与现实世界中的数字相关的任何用例。

限制不在小数位左侧或右侧。它是数字的总和。因此,如果您有Decimal(1000000) + Decimal("0.0001"),精度设置为10或更小,结果将等于Decimal(1000000)(它可能会显示额外的零以匹配精度,但0.0001将被删除)。舍入或溢出情况下的行为可以用信号配置,因此它可以设置标志,或者在发生时引发异常。文档对此进行了更详细的介绍。

相关文章