浮點(diǎn)數(shù)一個(gè)普遍的問(wèn)題就是在計(jì)算機(jī)的世界中授药,浮點(diǎn)數(shù)并不能準(zhǔn)確地表示十進(jìn)制士嚎。并且,即便是最簡(jiǎn)單的數(shù)學(xué)運(yùn)算悔叽,也會(huì)帶來(lái)不可控制的后果莱衩。因?yàn)椋谟?jì)算機(jī)的世界中只認(rèn)識(shí)0與1娇澎。
>>> x =4.20>>> y =2.10>>> x + y6.3000000000000007>>> (x+y) ==6.3False>>> x =1.2>>> y =2.3>>> x + y3.5>>> (x + y) ==3.5True
上述種種問(wèn)題笨蚁,就來(lái)自于計(jì)算機(jī)的cpu與浮點(diǎn)數(shù)的表示方式,我們自己在代碼層面是沒(méi)法控制的趟庄。在有些需要精確表示浮點(diǎn)數(shù)的場(chǎng)合括细,例如財(cái)務(wù)結(jié)算,這些誤差就不可接受戚啥。
decimal模塊進(jìn)行十進(jìn)制數(shù)學(xué)計(jì)算
python中的decimal模塊可以解決上面的煩惱
decimal模塊中奋单,可以通過(guò)整數(shù),字符串或原則構(gòu)建decimal.Decimal對(duì)象猫十。如果是浮點(diǎn)數(shù)览濒,特別注意因?yàn)楦↑c(diǎn)數(shù)本身存在誤差呆盖,需要先將浮點(diǎn)數(shù)轉(zhuǎn)化為字符串。
>>> fromdecimalimportDecimal>>> fromdecimalimportgetcontext>>> Decimal('4.20') + Decimal('2.10')Decimal('6.30')>>> fromdecimalimportDecimal>>> fromdecimalimportgetcontext>>> x =4.20>>> y =2.10>>> z = Decimal(str(x)) + Decimal(str(y))>>> zDecimal('6.3')>>> getcontext().prec =4#設(shè)置精度>>> Decimal('1.00') /Decimal('3.0')Decimal('0.3333')
當(dāng)然精度提升的同時(shí)贷笛,肯定帶來(lái)的是性能的損失应又。在對(duì)數(shù)據(jù)要求特別精確的場(chǎng)合(例如財(cái)務(wù)結(jié)算),這些性能的損失是值得的乏苦。但是如果是大規(guī)模的科學(xué)計(jì)算株扛,就需要考慮運(yùn)行效率了。畢竟原生的float比Decimal對(duì)象肯定是要快很多的邑贴。