簡體   English   中英

如何在十進制 python 中禁用舍入?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM