先看代碼:
i = 1
while i != 1.5:
print(i)
i += 0.1
上面的代碼輸出是多少?正確答案是無限循環(huán)輸出。
1
1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.5000000000000004
1.6000000000000005
1.7000000000000006
1.8000000000000007
1.9000000000000008
2.000000000000001
2.100000000000001
2.200000000000001
2.300000000000001
2.4000000000000012
2.5000000000000013
2.6000000000000014
2.7000000000000015
2.8000000000000016
2.9000000000000017
3.0000000000000018
3.100000000000002
...
原因就在于0.1不是精確表示,在循環(huán)到第5次的時候独柑,i的實(shí)際值是1.5000000000000004。所以此程序根本就沒有跳出while循環(huán)的機(jī)會私植。
在計(jì)算機(jī)的世界里忌栅,浮點(diǎn)數(shù)的存儲規(guī)則決定了不是所有的浮點(diǎn)數(shù)都能夠精確表示。有些不能精確表示的曲稼,只能無限接近狂秘,比如0.1轉(zhuǎn)換成二進(jìn)制是0.00011001100110011...其中0011是無限循環(huán)的。
所以在while中 躯肌!=1.5 這種表達(dá)式是要避免的。浮點(diǎn)數(shù)的比較同樣最好能夠指明精度破衔。