1. 程式人生 > >Python 中的浮點數

Python 中的浮點數

先看一個違反直覺的例子:

>>> s = 0.
>>> for i in range(10): s += .1
>>> s
0.9999999999999999
					# 錯誤被累加

再看一個更為普遍,直接影響判斷邏輯的例子:

>>> from math import sqrt
>>> a = sqrt(2)
>>> a*a == a
False

之所以會出現以上的結果,在於 Python (更準確地說是計算機硬體體系結構)對浮點數的表示,我們來看計算機(基於二進位制)對十進位制小數 0.1

0.1 的表示,十進位制小數向二進位制小數轉換的方法請見 <a href=“http://blog.csdn.net/lanchunhui/article/details/50575661”, target="">十進位制小數<==>二進位制小數 。將十進位制小數 0.10.1 轉換為二進位制時的結果為 0.0001100110011001....0.0001100110011001....,無限迴圈,計算機無法展示無限的結果,只能對結果進行截斷,這是浮點數精度問題的根源。

1. “==” on floats

基於以上的考慮,當我們進行浮點數的相等比較時,要特別小心,直接使用 ==== 是有問題的,一種通用的做法即是,不是檢測浮點數是否相等

,而是檢測二者是否足夠接近

>>> a = sqrt(2)
>>> abs(a*a-2) < epsilon
					# 判斷是否小於某一小量

2. is_integer()

is_integer() 判斷一個浮點數是不是整數。

>> 1.0.is_integer()
True
>> 1.01.is_integer()
False