可能重複:
strange output in comparision of float with float literal浮點問題用C
float a = 0.7;
if (a < 0.7) ;
爲什麼這裏的表達式計算結果爲真?
可能重複:
strange output in comparision of float with float literal浮點問題用C
float a = 0.7;
if (a < 0.7) ;
爲什麼這裏的表達式計算結果爲真?
浮點數的精度有限。 0.7最有可能無法準確表示,因此a中的值可能爲0.6999999999982左右。相比之下,雙倍0.7(更準確地說:0.6999999999999999999999999384)將表明它更少。
檢查了這一點:http://docs.sun.com/source/806-3568/ncg_goldberg.html
由於0.7不能完全表示爲浮點數或雙精度值。當你將它存儲在一個浮點數中時,它會比它以double(默認值)表示時向下舍入一點點。
因爲字面0.7是double類型的,而不是浮動。的實際值是0.699999 ...修復:
if (a < 0.7f)
a的實際值是0.699999 ...假設可以是0.699999 ... :) – 2010-10-12 15:59:54
其他的答案暗示,但是,這個問題是由於你不加入一個「F」你的號碼引起的。
任何帶小數點的數字都會被編譯器隱式解釋爲double(即64位值的精度是float的兩倍)。在你的第一行中,你將一個double賦值給一個float,從而失去了精度(如果你打開了警告,你應該有警告,你會得到一個編譯器警告)。
在第二行中,您將float與double進行比較。浮動將被提升爲雙倍(如果我錯了,就糾正我),所以你有0.7的不精確版本,而更精確的0.7。
解決方案:用浮漂打交道時,即
float a = 0.7f;
if (a < 0.7f);
務必用 「F」 試試這個:在most effective way for float and double comparison
float a = 0.7f;
if (fabs(a - 0.7f) < numeric_limits<float>::epsilon) ;
更多細節。
閱讀:What Every Computer Scientist Should Know About Floating-Point Arithmetic
每計算機程序員必須知道這一點。
http://docs.sun.com/source/806-3568/ncg_goldberg.html – DumbCoder 2010-10-12 15:42:47