if(0.1+0.1+0.1 == 0.3) printf("equal\n"); else printf("not equal\n");
會輸出"equal"嗎?不會!實際浮點數運算時,0.1+0.1+0.1 != 0.3spa
double i; for(i=0;i!=10;i+=0.1) printf("%.1lf\n",i);
程序會從0.0打印至9.9時結束循環嗎?不會!由於i永遠也不可能等於10,這個會無限循環code
計算機中的全部數據都使用二進制表示的,包括浮點數,這就致使某些浮點數不能用二進制精確表示,例如0.1(這很容易理解,就像10/3=0.33333……不能被十進制精確表示同樣)blog
例如:class
(0.5)10 = 2-1 = (0.1)2循環
(0.75)10 = 2-1 + 2-2 = (0.11)2二進制
(0.875)10 = 2-1 + 2-2 + 2-3 = (0.111)2程序
(0.1)10 = 2-4 + 2-5 + 2-8 + …… = (0.00011001……)2數據
其中0.1只能無限循環下去,這就意味着0.1在計算機中不能被精確表示,所以產生上述兩個陷阱也就很容易理解,它們都涉及了不能用二進制精確表示的0.1參與運算,因此得不到預期的結果。例如陷阱二,把步長改成能夠用二進制精確表示的0.5,則不會無限循環下去。計算機