計算
一、一般情況。round(number[, ndigits])函數返回number舍入到小數點後ndigits位精度的值,比如:
round(3.14, 1)
3.1
如果ndigits被省略或為None,則返回最接近number的整數,除此之外,返回值與number的類型一緻。
round(3.14, None)
3
round(3.14, 0) # 不是被省略,也不是None
3.0
看看ndigits為負數的情況,同樣,結果會被舍入到最接近10的負ndigits次幂的倍數。(負負得正,會對整數位進行舍入)
round(314, -1)
310
二、特殊情況。若number離前後的有效數距離相等時,比如0.5,若保留整數部分,很顯然,其離0和離1的距離一樣,這個時候round會如何取舍呢?先看看下面實際的運行結果情況:
round(0.5) # 離0和1的距離相等
0
round(-0.5) # 離0和-1的距離相等
0
round(1.5) # 離1和2的距離相等
2
round(2.5) # 離2和3的距離相等
2
round的規則是這樣的(python3版本):選擇偶數!上面的結果也印證了這一規則。
三、失真情況。一些十進制小數在計算機中無法用二進制精确表示,存在失真,比如3.675,在計算機中的二進制數接近如下情況:
print(f'{3.675:.20f}')
3.67499999999999982236
所以,如果我們采用round函數保留2位小數的話,很顯然,計算機認為更接近3.67,驗證一下:
round(3.675, 2) # 雖然看起來與3.67、3.68的距離相同
3.67
簡單解釋一下因為進制轉換導緻的失真,比如,三分之一,在我們十進制世界裡就無法用小數精準表示,即使寫成0.33333333,後面加再多的3,依然存在誤差。但是在三進制世界裡,卻可以精準地表示為0.1。
總結:
小補充,針對編程小白人員:
round(3.004, 2)
3.0
我要的是保留2位小數,為啥輸出的隻有一位小數呢?round是不是搞錯了?!這裡确實冤枉round函數了,round函數按照前面講的規則計算出結果後,對尾部的非有效位确實清0了,然後函數以浮點數或整數返回,對于返回的結果若用于運算,不會有任何問題,但我們上面看到的“3.0”是格式化打印顯示,屬于數值的格式化輸出範疇,跟round沒有關系。更深入一步,round函數也僅對尾部的非有效位清0,而不是真正的截斷,一方面,對于數值運算不影響,另一方面,計算機中數值運算的有效位是固定的,就是咱們經常提到的32位或64位(二進制位)。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!