python 四捨五入

 

強轉int會向下取整python

int(2.9),結果爲2函數

 

四捨五入就用round( )?Python四捨五入的正確打開方式!

 

round( )函數簡介

菜鳥教程中介紹到,round() 函數做用就是,返回浮點數x的四捨五入值。測試

> round( x [, n]  )
  •  

參數x,n均爲數值表達式,返回值爲x的四捨五入值。n爲保留的小數位數,不加n則只保留x四捨五入後的整數部分。spa

>>> round(2.3)
2
>>> round(2.45, 1)
2.5
  •  

特殊狀況

上面的結果並無錯誤,這裏再用2.675測試一下:設計

>>> round(2.675, 2)
2.67
  • 1
  • 2

顯然結果不符合四捨五入的規則。爲何會這樣呢?緣由是:round()函數只有一個參數,不指定位數的時候,返回一個整數,並且是最靠近的整數,相似於四捨五入,當指定取捨的小數點位數的時候,通常狀況也是使用四捨五入的規則,可是碰到.5的狀況時,若是要取捨的位數前的小數是奇數,則直接捨棄,若是是偶數則向上取捨。code

這也就解釋了上述現象。可這樣一來用round()函數取浮點數的四捨五入值不就變得不可靠了嘛?這樣的函數設計的意義何在?網上搜了一圈答案,以爲這個說法比較準確:blog

python3(注意python2 和 3的round()是不同的,這裏僅以python3做說明)中round()對浮點數的取捨遵循的是「四捨六入五平分」,「五平分」就是根據取捨的位數前的小數奇偶性來判斷,奇偶平分,符合公平性原則(四捨五入不是公平的),這樣一來也就保證了在數據量較大的狀況下,篩選數據的真實性。(數學渣,不知道這樣理解對否……)教程

爲何須要平分呢?緣由就是部分小數沒法用二進制完整表示,如1.15,轉爲二進制將是很長的一串數字:1.0010011001100110011001100110011001100110011001100110011 這可不是簡單的幾個字節就能存放下的。所以這裏就出現了取捨的問題。ci

那麼正確的四捨五入是否沒法實現了呢?固然是有解決辦法的。好比,當你須要四捨五入保留兩位小數的時候,能夠將數值乘以100再除以100.0:數學

>>> round(2.675 * 100)/100.0
2.68
  •  

這樣能夠解決部分浮點數四捨五入的問題。爲何是部分呢?筆者發現:

>>> round(2.135*100)/100.0
2.13
  •  

 

檢驗下過程:

>>> 2.135*100
213.49999999999997
  • 1

WTF!是精度問題嘛!

>>> Decimal(2.135)*100
Decimal('213.4999999999999786837179272')
  • 1
  • 2

愣住

沒法理解是否是!!二進制的世界正常人真的不懂,盼望一下將來有能夠直接計算十進制的硬件誕生吧。

總結

在用round()函數進行四捨五入時,若是你對結果有十足把握,而且這就是你想要的結果,那就放心大膽地使用。否則就老老實實寫個函數來實現吧,這不是什麼難事。

相關文章
相關標籤/搜索