詳解Python中的數(shù)據(jù)精度問題
一、python運(yùn)算時(shí)精度問題
1.運(yùn)行時(shí)精度問題
在Python中(其他語言中也存在這個(gè)問題,這是計(jì)算機(jī)采用二進(jìn)制導(dǎo)致的),有時(shí)候由于二進(jìn)制和十進(jìn)制之間對應(yīng)問題會(huì)導(dǎo)致數(shù)值的精度問題,比如無法用有限個(gè)二進(jìn)制位完整地表示0.1,因?yàn)?.1轉(zhuǎn)化為二進(jìn)制之后位一個(gè)無限循環(huán)小數(shù)
print(1.1*2.2)
查看運(yùn)行結(jié)果:
2.解決方案:添加方法
需要將整數(shù)部分與小數(shù)部分單獨(dú)做處理可以解決
def multiple(m1, m2): r='' ## 若存在浮點(diǎn)型,則先轉(zhuǎn)化為整數(shù) if type( m1 )==float or type( m2 )==float: print( "存在浮點(diǎn)數(shù)" ) len_m1=len( str( m1 ).split( "." )[1] ) len_m2=len( str( m2 ).split( "." )[1] ) print( "m1的小數(shù)位:", len_m1 ) print( "m2的小數(shù)位:", len_m2 ) m1=int( 10**len_m1*m1 ) m2=int( 10**len_m2*m2 ) print( "m1化為整數(shù):", m1 ) print( "m2化為整數(shù):", m2 ) r=str( m1*m2 ) print( "r:", r ) l=len_m1+len_m2 print( "l的總長度:", l ) if l<len( r ): r_front=r[:-l] r_last=r[-l:] print( r_front, "-", r_last ) r=r_front+"."+r_last else: r="0."+(l-len( r ))*"0"+r else: print( "不存在浮點(diǎn)數(shù)" ) r=m1*m2 return r res = multiple(1.1,2.2) print(res)
查看運(yùn)行結(jié)果:
二、python四舍五入時(shí)精度問題
1.使用round與浮點(diǎn)數(shù)格式化時(shí)候的精度問題
歸根結(jié)底是計(jì)算機(jī)存儲(chǔ)浮點(diǎn)數(shù)的問題
a1 = 0.235 a2 = round(a1,2) a3 = '%.2f' % a1 print(a2) print(a3)
查看運(yùn)行結(jié)果:
2.解決方案,使用Decimal函數(shù)
需要將float轉(zhuǎn)換為Decimal,該類可以通過接受字符串(務(wù)必是字符串)形式的浮點(diǎn)數(shù)實(shí)現(xiàn)相對精確的小數(shù)計(jì)算(減緩了精度誤差,但沒有消滅)
from decimal import Decimal a1 = 0.235 a2 = Decimal(str(a1)).quantize(Decimal("0.00")) a3 = '{:.2f}'.format(Decimal(str(a1))) print(a2) print(a3)
查看運(yùn)行結(jié)果:
到此這篇關(guān)于詳解Python中的數(shù)據(jù)精度問題的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)精度問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中Array和DataFrame相互轉(zhuǎn)換的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于python中Array和DataFrame相互轉(zhuǎn)換的實(shí)例講解內(nèi)容,對此有需要的朋友們可以學(xué)參考下。2021-02-02Python json 錯(cuò)誤xx is not JSON serializable解決辦法
這篇文章主要介紹了Python json 錯(cuò)誤xx is not JSON serializable解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03基于Google的Python編碼規(guī)范標(biāo)準(zhǔn)
這篇文章主要介紹了基于Google的Python編碼規(guī)范標(biāo)準(zhǔn),其中包含了分號(hào),行長度,括號(hào),縮進(jìn),空行,空格等基本符號(hào)的使用規(guī)則,有需要的朋友可以參考下2021-08-08DataFrame窗口函數(shù)rolling()的用法
這篇文章主要介紹了DataFrame窗口函數(shù)rolling()的用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02