如何修复Python中十进制数字的错误?

2024-06-17 15:20:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

0.00402787895809813677877597726251   0.00402787895809813677877597726251
0.00402787895809813677877597726251   0.00402787895809813677877597726251
0.00402787895809813677877597726251   0.00402787895809813677877597726251

正如您所看到的,它们是相同的,但是基数是不同的。 如何修复这个bug

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)

Tags: 模块from程序数字差异onelsbug
1条回答
网友
1楼 · 发布于 2024-06-17 15:20:22

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

>>> 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在内部被“四舍五入”为相同的数字(有关为什么不可避免的原因的更多详细信息,请参见Floating Point Arithmetic: Issues and Limitations

>>> 0.0040278789580981364238
0.004027878958098137
>>> 0.0040278789580981370940
0.004027878958098137

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

相关问题 更多 >