大多數情況下,我們會使用 round 來保留小數,但這並不符合我們在數學知識裡的規則。
round(number[, ndigits])
round() 把number(通常是浮點數) 如下規則(Python3)進行四捨五入的:
先說下ndigits 不為0 的情況:
如果保留位數的後一位小於等於4,則捨去,如round(5.214,2) = 5.21
如果保留位數的後一位等於5,且該位數後面沒有數字,則不進位,如round(5.215,2) = 5.21
如果保留位數的最後一位等於5,且該位數後面有數字,則進位,如round(5.2151,2) = 5.22
如果保留位數的最後一位大於等於6 ,則進位。如round(5.216,2) = 5.22
>>> round(5.214,2) 5.21 >>> round(5.215,2) 5.21 >>> round(5.2151,2) 5.22 >>> round(5.216,2) 5.22 >>>
但是上述規則2 也有例外,例如:
>>> round(0.645,2) 0.65 >>>
究其原因,浮點數用用二進位表示的時候只能表示近似值,雖然我們看到的是0.645,實際上Python 儲存的是0.645000000000000017763568394002504646778106689453125,Python 是依照IEEE754 標準儲存浮點數的標準儲存浮點數。
再說下ndigits 為0 或None 的情況:
如果保留位數的後一位小於等於4,則捨去,如round(1.4) = 1
#如果保留位數的後一位等於5,且後面沒有數字,則取最近的偶數,如round(1.5)=2,round(2.5)=2
如果保留位數的後一位等於5,且後面有數字,則近位,如round(2.51)=3
如果保留位數的最後一位大於等於6 ,則進位。如 round(1.6) = 2
>>> round(1.5) 2 >>> round(1.4) 1 >>> round(1.6) 2 >>> round(2.5) 2 >>> round(2.51) 3 >>>
請注意, f 字串的保留結果與 round 一致:
>>> f"{1.5:.0f}" '2' >>> f"{2.5:.0f}" '2' >>> f"{2.51:.0f}" '3'
那麼如何獲得和數學上的四捨五入規則一致的方法呢?請使用方法二:
這種方法有個前提,那就是必須先把小數轉換成字串,這樣才可以精確的表示浮點數。
import decimal # 修改舍入方式为四舍五入 decimal.getcontext().rounding = "ROUND_HALF_UP" x = "0.645" x1 = decimal.Decimal(x).quantize(decimal.Decimal("0.00")) print(f"{x} 的近似值为 {x1}") y = "2.5" y1 = decimal.Decimal(y).quantize(decimal.Decimal("0")) print(f"{y} 的近似值为 {y1}")
以上程式的輸出如下:
0.645 的近似值为 0.65 2.5 的近似值为 3
完全符合我們數學上的四捨五入。
浮點數在二進位的表示方法中只能表示近似值,這一點,可以查閱文件[1]。了解了浮點數表示法之後,再看四捨五入,就不會覺得那麼奇怪了。
[1]文件: https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
以上是Python 的四捨五入的兩個方法,你學會了嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!