from decimal import *
Pi=Decimal(3.141592653589793238462643383279502884197169399373)
print(Pi)
实际输出:
3.141592653589793115997963468544185161590576171875
输出应为:
3.141592653589793238462643383279502884197169399373
为什么值会改变?
>>> from decimal import Decimal
# bad
>>> Decimal(3.141592653589793238462643383279502884197169399373)
Decimal('3.141592653589793115997963468544185161590576171875')
# good
>>> Decimal('3.141592653589793238462643383279502884197169399373')
Decimal('3.141592653589793238462643383279502884197169399373')
>>> 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')
应该向Decimal()
传递字符串,而不是浮点数,因为浮点数本身就不精确。此外,请注意来自Python文档的以下内容:
与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以根据需要为给定问题设置任意大的精度
from decimal import *
getcontext().prec = 100 #precision
pi = Decimal("3.141592653589793238462643383279502884197169399373")
print(pi) #3.141592653589793238462643383279502884197169399373
Pi=Decimal("Pi")+(Decimal("sign")*(Decimal("4")/(Decimal("k")* (Decimal("k")+Decimal("1"))*(Decimal("k")+Decimal("2"))))) decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
- abc bcdDecimal("k")
和Decimal("sign")
没有意义。如果您已经有名为k
和sign
的浮点变量中的数据,请执行Decimal(str(k))
和Decimal(str(sign))
;str()
调用确保您触发了Python的浮点字符串化,这将使一些过度精确的浮点数转换为更好的形式。 - AKXpickle
或json
来存储和加载任意数据,而不是尝试以编程方式修改 Python 文件。 - AKX