[英]How to disable rounding in Decimal python?
計算時,我得到了錯誤的最后一位數字。 起初,我只是用比我需要的多一個數字的精度來計算,然后我只是用切片刪除了最后一個四舍五入的數字。 但后來我注意到有時十進制舍入超過一位。 不四舍五入可以計算嗎?
例如
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”(最后 2 位數字是錯誤的),但如果我嘗試 pi(13),它們都會變成正確的 - “3.1415926535899”。
它稱為舍入誤差,在使用Floating-Point Arithmetic時是不可避免的。 您可以在 Python REPL 中編寫以下代碼,有趣的是,應該會得到False
。
0.2 + 0.1 == 0.3 # False
這是因為浮點數的最后幾位實際上是垃圾。 解決此問題的一種方法是在系列中使用更多項,然后將結果四舍五入到所需的精度。
如果您想更深入地了解這一點,可以閱讀我附上的這兩個鏈接,也許還可以閱讀一些數值計算教科書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.