1. 程式人生 > >Pyhon float減法的非零問題

Pyhon float減法的非零問題

最近在專案開發遇到的一個奇怪的問題,明明兩個取值為0.01的float型變數相減,所得結果卻不為0, 而是詭異的-1.73472347598e-18。

查閱相關資料發現float型變數在小數位數過多時確實會發生這種現象,驗證如下:

# coding=utf-8

if __name__ == '__main__':
    for i in range(7):
        a = 1/(10.0**i)
        b = (1/10.0)**i
        print i, a, b, a-b

輸出結果:
0 1.0 1.0 0.0
1 0.1 0.1 0.0
2 0.01 0.01 -1.73472347598e-18
3 0.001 0.001 -2.16840434497e-19
4 0.0001 0.0001 -1.35525271561e-20
5 1e-05 1e-05 -1.69406589451e-21
6 1e-06 1e-06 -4.23516473627e-22

python中float型變數如果在進行減法運算前進行位數指定,而不採用系統預設長度時可以避免該問題,修改如下:

for i in range(7):
        a = float('%.6f' % (1/(10.0**i)))
        b = float('%.6f' % ((1/10.0)**i))
        print i, a, b, a-b

輸出結果:
0 1.0 1.0 0.0
1 0.1 0.1 0.0
2 0.01 0.01 0.0
3 0.001 0.001 0.0
4 0.0001 0.0001 0.0
5 1e-05 1e-05 0.0
6 1e-06 1e-06 0.0