如何修复Python中的小数错误



我有一个程序可以生成我需要的表。当数字之间的差异足够大(大约5分(时,一切都很好。所以我决定使用十进制库。但当我把这个模块添加到程序中时,一切都坏了(数字是一样的(。这是我使用Decimal 的输出(几行开始(

0.00402787895809813677877597726251   0.00402787895809813677877597726251
0.00402787895809813677877597726251   0.00402787895809813677877597726251
0.00402787895809813677877597726251   0.00402787895809813677877597726251

正如你所看到的,它们是相同的,但是基数不同。如何修复该错误?

from decimal import *
getcontext().prec = 30
ls = [1,4,2,1,1,1,2,1,1,1,1,1,1,1,1,2]
#N = Decimal(22)
l = Decimal(0.0040278789580981364238)
r = Decimal(0.0040278789580981370940)
one = Decimal(r-l)/Decimal(22)
print(len(ls))
for elem in ls:
print(Decimal(l),'t',Decimal(l)+Decimal(one)*Decimal(elem))
l+=Decimal(one)*Decimal(elem)

您需要从字符串而不是浮点构造小数:

>>> from decimal import Decimal
>>> Decimal(0.0040278789580981370940)
Decimal('0.004027878958098136778775977262512242305092513561248779296875')
>>> Decimal(0.0040278789580981364238)
Decimal('0.004027878958098136778775977262512242305092513561248779296875')
>>> Decimal("0.0040278789580981370940")
Decimal('0.0040278789580981370940')
>>> Decimal("0.0040278789580981364238")
Decimal('0.0040278789580981364238')

浮点具有有限的精度,这意味着0.00402787895809813709400.0040278789580981364238都是"零";"四舍五入";内部为相同的数字(有关为什么这是不可避免的,请参阅浮点运算:问题和限制(。

>>> 0.0040278789580981364238
0.004027878958098137
>>> 0.0040278789580981370940
0.004027878958098137

如果使用字符串作为构造函数,则可以以任意精度生成Decimal。

最新更新