python執(zhí)行精確的小數(shù)計算方法
在進行浮點數(shù)計算時它們無法精確表達出所有的十進制小數(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基礎(chǔ)教程之Pandas數(shù)據(jù)分析庫詳解
Pandas是一個基于 NumPy 的非常強大的開源數(shù)據(jù)處理庫,它提供了高效、靈活和豐富的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,本文中,我們將學(xué)習(xí)如何使用Pandas來處理和分析數(shù)據(jù),感興趣的小伙伴跟著小編一起來看看吧2023-07-07
Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式
python中字典的健和值是一一對應(yīng)的,如果對字典進行添加操作時如果健的名字相同,則當(dāng)前健對應(yīng)的值就會被覆蓋,有時候我們想要一個健對應(yīng)多個值的場景,這篇文章主要給大家介紹了關(guān)于Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下2023-10-10
python批量合成bilibili的m4s緩存文件為MP4格式 ver2.5
這篇文章主要介紹了python批量合成bilibili的m4s緩存文件為MP4格式 ver2.5的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Python基于自然語言處理開發(fā)文本摘要系統(tǒng)
自然語言處理(NLP)是人工智能領(lǐng)域中一個重要的研究方向,而文本摘要作為NLP的一個重要應(yīng)用,在信息爆炸的時代具有重要意義,下面我們來看看如何開發(fā)一個基于Python的文本摘要系統(tǒng)吧2025-04-04

