Python 中的浮點數
阿新 • • 發佈:2019-01-09
先看一個違反直覺的例子:
>>> s = 0.
>>> for i in range(10): s += .1
>>> s
0.9999999999999999
# 錯誤被累加
再看一個更為普遍,直接影響判斷邏輯的例子:
>>> from math import sqrt
>>> a = sqrt(2)
>>> a*a == a
False
之所以會出現以上的結果,在於 Python (更準確地說是計算機硬體體系結構)對浮點數的表示,我們來看計算機(基於二進位制)對十進位制小數 的表示,十進位制小數向二進位制小數轉換的方法請見 <a href=“http://blog.csdn.net/lanchunhui/article/details/50575661”, target="">十進位制小數<==>二進位制小數 。將十進位制小數 轉換為二進位制時的結果為 ,無限迴圈,計算機無法展示無限的結果,只能對結果進行截斷,這是浮點數精度問題的根源。
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