python四舍五入round_四舍五入就用round( )?Python四舍五入的正确打开方式!
四舍五入就用round( )?Python四舍五入的正確打開(kāi)方式!
2018-09-22 21:40
閱讀數(shù) 4
<>round( )函數(shù)簡(jiǎn)介
菜鳥(niǎo)教程中介紹到,round() 函數(shù)作用就是,返回浮點(diǎn)數(shù)x的四舍五入值。
> round( x [, n] )
參數(shù)x,n均為數(shù)值表達(dá)式,返回值為x的四舍五入值。n為保留的小數(shù)位數(shù),不加n則只保留x四舍五入后的整數(shù)部分。
>>> round(2.3) 2 >>> round(2.45, 1) 2.5
<>特殊情況
上面的結(jié)果并沒(méi)有錯(cuò)誤,這里再用2.675測(cè)試一下:
>>> round(2.675, 2) 2.67
顯然結(jié)果不符合四舍五入的規(guī)則。為什么會(huì)這樣呢?原因是:round()函數(shù)只有一個(gè)參數(shù),不指定位數(shù)的時(shí)候,返回一個(gè)整數(shù),而且是最靠近的整數(shù),類似于四舍五入,當(dāng)指定取舍的小數(shù)點(diǎn)位數(shù)的時(shí)候,一般情況也是使用四舍五入的規(guī)則,但是碰到.5的情況時(shí),如果要取舍的位數(shù)前的小數(shù)是奇數(shù),則直接舍棄,如果是偶數(shù)則向上取舍。
這也就解釋了上述現(xiàn)象。可這樣一來(lái)用round()函數(shù)取浮點(diǎn)數(shù)的四舍五入值不就變得不可靠了嘛?這樣的函數(shù)設(shè)計(jì)的意義何在?網(wǎng)上搜了一圈答案,覺(jué)得這個(gè)說(shuō)法比較準(zhǔn)確:
python3(注意python2 和
3的round()是不一樣的,這里僅以python3作說(shuō)明)中round()對(duì)浮點(diǎn)數(shù)的取舍遵循的是“四舍六入五平分”,“五平分”就是根據(jù)取舍的位數(shù)前的小數(shù)奇偶性來(lái)判斷,奇偶平分,符合公平性原則(四舍五入不是公平的),這樣一來(lái)也就保證了在數(shù)據(jù)量較大的情況下,篩選數(shù)據(jù)的真實(shí)性。(數(shù)學(xué)渣,不知道這樣理解對(duì)否……)
為什么需要平分呢?原因就是部分小數(shù)無(wú)法用二進(jìn)制完整表示,如1.15,轉(zhuǎn)為二進(jìn)制將是很長(zhǎng)的一串?dāng)?shù)字:
1.0010011001100110011001100110011001100110011001100110011
這可不是簡(jiǎn)單的幾個(gè)字節(jié)就能存放下的。因此這里就出現(xiàn)了取舍的問(wèn)題。
那么正確的四舍五入是否無(wú)法實(shí)現(xiàn)了呢?當(dāng)然是有解決辦法的。比如,當(dāng)你需要四舍五入保留兩位小數(shù)的時(shí)候,可以將數(shù)值乘以100再除以100.0:
>>> round(2.675 * 100)/100.0 2.68
這樣可以解決部分浮點(diǎn)數(shù)四舍五入的問(wèn)題。為什么是部分呢?筆者發(fā)現(xiàn):
>>> round(2.135*100)/100.0 2.13
檢驗(yàn)下過(guò)程:
>>> 2.135*100 213.49999999999997
WTF!是精度問(wèn)題嘛!
>>> Decimal(2.135)*100 Decimal('213.4999999999999786837179272')
無(wú)法理解是不是!!二進(jìn)制的世界正常人真的不懂,盼望一下未來(lái)有可以直接計(jì)算十進(jìn)制的硬件誕生吧。
<>總結(jié)
在用round()函數(shù)進(jìn)行四舍五入時(shí),如果你對(duì)結(jié)果有十足把握,并且這就是你想要的結(jié)果,那就放心大膽地使用。不然就老老實(shí)實(shí)寫(xiě)個(gè)函數(shù)來(lái)實(shí)現(xiàn)吧,這不是什么難事。
總結(jié)
以上是生活随笔為你收集整理的python四舍五入round_四舍五入就用round( )?Python四舍五入的正确打开方式!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 神话电影飞毯
- 下一篇: python对文件的操作模式_pytho