python執(zhí)行精確的小數(shù)計算方法
在進(jìn)行浮點數(shù)計算時它們無法精確表達(dá)出所有的十進(jìn)制小數(shù)位。
a = 4.1 b = 5.329 print(a+b) 9.428999999999998
這些誤差實際上是底層CPU的浮點運算單元和IEEE754浮點數(shù)算數(shù)標(biāo)準(zhǔn)的一種“特性”。python的浮點數(shù)類型保存的數(shù)據(jù)采用的是原始表示形式,因此使用float實例時就不能避免這樣的誤差。
我們可以使用decimal模塊避免這種操作(如果不介意犧牲下性能):
from decimal import Decimal a = Decimal('4.1') b = Decimal('5.329') print(a+b) 9.429
注意Decimal的參數(shù)必須是字符串,不能是浮點型,否則誤差依舊存在。
decimal模塊的主要功能是允許控制計算過程中的各個方面,包括數(shù)字的尾數(shù)和四舍五入。
from decimal import Decimal from decimal import localcontext a = Decimal(4.1) b = Decimal(5.329) print(a/b) print('================') with localcontext() as ctx: ctx.prec = 3 print(a/b) 0.7693751172827922400071261708 ================ 0.769
getcontext也可以實現(xiàn)和localcontext一樣的功能
from decimal import Decimal, getcontext a = Decimal(4.1) b = Decimal(5.329) getcontext().prec = 3 print(a/b) 0.769
誤差我們不能完全消除,我們只能盡力優(yōu)化算法,使得誤差盡可能小。在大數(shù)和小數(shù)相加時要格外注意。
nums = [3.21e+18, 1, -3.21e+18] print(sum(nums)) print('=========================') import math res = math.fsum(nums) print(res) 0.0 ========================= 1.0
以上這篇python執(zhí)行精確的小數(shù)計算方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python 字符串處理特殊空格\xc2\xa0\t\n Non-breaking space
今天遇到一個問題,使用python的find函數(shù)尋找字符串中的第一個空格時沒有找到正確的位置,下面是解決方法,需要的朋友可以參考下2020-02-02Python二維列表的創(chuàng)建、轉(zhuǎn)換以及訪問詳解
列表中的元素還可以是另一個列表,這種列表稱為多為列表,只有一層嵌套的多維列表稱為二維列表,下面這篇文章主要給大家介紹了關(guān)于Python二維列表的創(chuàng)建、轉(zhuǎn)換及訪問的相關(guān)資料,需要的朋友可以參考下2022-04-04Python爬蟲實現(xiàn)抓取電影網(wǎng)站信息并入庫
本文主要介紹了利用Python爬蟲實現(xiàn)抓取電影網(wǎng)站信息的功能,并將抓取到的信息入庫。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-02-02