Python中的十进制模块不准确

3
from decimal import *
Pi=Decimal(3.141592653589793238462643383279502884197169399373)
print(Pi)

实际输出:

3.141592653589793115997963468544185161590576171875

输出应为:

3.141592653589793238462643383279502884197169399373

为什么值会改变?
2个回答

5
你正在向Decimal构造函数传递一个浮点数,而浮点数本质上是不精确的(另请参见Python手册)。
要将精确数字传递给Decimal构造函数,请将其作为字符串传递。
>>> from decimal import Decimal

# bad
>>> Decimal(3.141592653589793238462643383279502884197169399373)
Decimal('3.141592653589793115997963468544185161590576171875')

# good
>>> Decimal('3.141592653589793238462643383279502884197169399373')
Decimal('3.141592653589793238462643383279502884197169399373')

如果您有一个浮点变量,可以先将其转换为字符串,然后再转换为Decimal以避免一些浮点不精确性:
>>> a = 0.1 + 0.2
0.30000000000000004
>>> Decimal(a)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(str(a))
Decimal('0.30000000000000004')
>>>

如果您需要完全的精度,只需一路使用十进制数:
>>> Decimal("0.1") + Decimal("0.2")
Decimal('0.3')

我在我的计算中使用了这个,但是出现了这个错误:Pi=Decimal("Pi")+(Decimal("sign")*(Decimal("4")/(Decimal("k")* (Decimal("k")+Decimal("1"))*(Decimal("k")+Decimal("2"))))) decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>] - abc bcd
1
Decimal("k")Decimal("sign")没有意义。如果您已经有名为ksign的浮点变量中的数据,请执行Decimal(str(k))Decimal(str(sign))str()调用确保您触发了Python的浮点字符串化,这将使一些过度精确的浮点数转换为更好的形式。 - AKX
@abcbcd 这是一个完全不同的问题,但是请查看 picklejson 来存储和加载任意数据,而不是尝试以编程方式修改 Python 文件。 - AKX
我知道,但我不能在90分钟内再提出另一个问题,谢谢。 - abc bcd

1

应该向Decimal()传递字符串,而不是浮点数,因为浮点数本身就不精确。此外,请注意来自Python文档的以下内容:

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

from decimal import *
getcontext().prec = 100 #precision

pi = Decimal("3.141592653589793238462643383279502884197169399373")
print(pi)    #3.141592653589793238462643383279502884197169399373

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接