Python數值處理(一)

round()取整

使用round()函數能夠輕鬆的對浮點數進行取整操做。示例以下:函數

>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-0.36, 1)
-0.4

round()第二個參數能夠是負數:性能

>>> a = 13849
>>> round(a, -1)
12850
>>> round(a, -2)
13800

可是要注意,這裏有兩個很奇怪的例子:spa

>>> round(2.5)
2
>>> round(0.5)
0

clipboard.png

能夠發現,這裏徹底沒有按照咱們所熟悉的四捨五入的取整規則來。這是由於round()函數在應對這種與兩個整數距離相同的狀況時,會取到最近的偶數上去。code

同時官方文檔中還舉了一個例子,orm

Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

round(2.675, 2)的結果竟然是2.67,這個的緣由是浮點數表示是有偏差的,2.675在計算機上實際上不是準確的2.675。ip

解釋一下浮點數問題

首先咱們要明確一個概念,計算機只能識別二進制,也就是一堆10的組合,可是人類經常使用的倒是十進制。
十進制的數在計算機裏就須要轉換成二進制表示,在將十進制整數轉爲二進制的時候,每每是將原數不斷除以2,直到商小於1,將每一次獲得的餘數逆序排列,就能獲得這個整數的二進制表示了。
到了小數部分,咱們採用的是乘以2,取整數部分,直到小數部分爲0,順序排列。可是有些特殊的數就要搞事情了。ci

clipboard.png

0.1 * 2 = 0.2 => 0
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
0.6 * 2 = 1.2 => 1
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
...

發現沒有,進入無限循環了,也就是說整數中一些小數,在二進制表示的時候是無限循環小數,可是在計算機中畢竟是用有限位來表示一個值的,這就形成了有些小數(浮點數)在計算機中是被截掉部分的,這就是浮點數不精確的緣由啦。文檔

decimal

若是你特別須要精確的數值,那麼可使用decimal模塊。固然這是有性能代價的(有得必有失嘛)。
舉個例子:it

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a+b) == 6.3
False
# 此次試試decimal
>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a+b)
6.3
>>> (a + b) == Decimal('6.3')
True

數值的輸出格式化

若是隻是想讓數值以固定的位數輸出,那麼是用不着round()的。io

>>> a = 1.23456
>>> format(a, '0.2f')
'1.23'
>>> format(a, '0.3f')
'1.234'

歡迎關注我的公衆號公子政的宅平常查看更多文章:

clipboard.png

相關文章
相關標籤/搜索