Pyhon float減法的非零問題
阿新 • • 發佈:2019-01-31
最近在專案開發遇到的一個奇怪的問題,明明兩個取值為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