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

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

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

clipboard.png

可以發現,這裏完全沒有按照我們所熟悉的四捨五入的取整規則來。這是因爲round()函數在應對這種與兩個整數距離相同的情況時,會取到最近的偶數上去。

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

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。

解釋一下浮點數問題

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

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模塊。當然這是有性能代價的(有得必有失嘛)。
舉個例子:

>>> 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()的。

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

歡迎關注個人公衆號公子政的宅日常查看更多文章:

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章