如何在Decimal python中禁用舍入



计算时,我得到了错误的最后一位数字。一开始,我只是计算的精度比我需要的高出一位数,然后我只是用切片去掉了最后一个四舍五入的数字。但后来我注意到,有时Decimal会舍入多个数字。可以不取整计算吗?

例如

from decimal import Decimal as dec, Context, setcontext, ROUND_DOWN
from math import log
def sqr(x):
return x*x
def pi(n):
getcontext().prec=n+1
a=p=1
b=dec(1)/dec(2).sqrt()
t=dec(1)/dec(4)
for _ in range(int(log(n,2))):
an=(a+b)/2
b=(a*b).sqrt()
t-=p*sqr(a-an)
p*=2
a=an
return sqr(a+b)/(4*t)

如果我尝试pi(12(;3.141592653591";(最后两个数字是错误的(,但如果我尝试pi(13(,它们都会变为正确的数字-";3.1415926535899";。

它被称为舍入误差,在使用浮点运算时是不可避免的。您可以在Python REPL中编写以下代码,有趣的是,应该会得到False

0.2 + 0.1 == 0.3 # False

这是因为浮点数的最后几位实际上是垃圾。解决这个问题的一种方法是在级数中使用更多的项,然后将结果四舍五入到所需的精度。

如果你想更深入地理解这一点,你可以阅读我附上的这两个链接,也许还有一些数值计算教科书。

最新更新