Python十进制库是不精确的?



我正在阅读Python Decimal模块。我需要做大量精确的计算,通常有很多小数位,随着时间的推移,误差会增加。输入十进制库。

步骤1:阅读Decimal库的介绍(添加粗体):

  • 十进制数可以精确表示。相比之下,像1.1和2.2这样的数字在二进制浮点数中没有精确的表示。最终用户通常不会期望1.1 + 2.2显示为3.3000000000000003,因为它显示的是二进制浮点数。

步骤2:在Python中插入一个小数。这似乎是不精确的——与浮点数计算的误差非常相似。

>>> from decimal import *
>>> 1.1 + 2.2
3.3000000000000003
>>> Decimal(3.3)
Decimal('3.29999999999999982236431605997495353221893310546875')

怎么回事?

根据文档:

从整型或浮点型进行精确的值转换。

float文字3.3的确切值不是3.3= 33/10,而是二进制近似值3715469692580659/250,其确切值是您在屏幕截图中看到的。如果这不是您想要的,那么将str而不是float传递给构造函数。

>>> from decimal import *
>>> Decimal(3.3)
Decimal('3.29999999999999982236431605997495353221893310546875')
>>> Decimal('3.3')
Decimal('3.3')

还请记住,虽然Decimal精确地表示以10为基数的分数,如1/10、1/100或1/1000,但其他分数是近似值(尽管比float更精确)。

>>> Decimal(1) / Decimal(3)
Decimal('0.3333333333333333333333333333')
>>> _ * 3
Decimal('0.9999999999999999999999999999')

如果这对您来说是一个问题,那么使用Fraction类而不是Decimal

>>> from fractions import *
>>> Fraction(1) / Fraction(3)
Fraction(1, 3)
>>> _ * 3
Fraction(1, 1)