float fx = 49.03f;
int nx = fx * 100;
printf("%d", nx);
運行上述代碼,結果:4902。
用VC6.0,2005,GCC編譯運行結果都是一樣。
爲什麼會這樣呢,是因爲浮點數運算具有不精確性。其實編譯上面的代碼,編譯器會有警告的。
warning C4244: 'initializing' : conversion from 'float' to 'int', possible loss of data
將單精度浮點數強制轉換爲整形會造成數據精度丟失。
因此我們在對浮點數進行強制轉換時前就應該明確我們做這次轉換的目的,一般浮點數轉換整數的方式有三種: 向下取整, 向上取整, 和四捨五入。封閉對應的C函數是floor,ceil,round,VC沒有提供round函數,具體原因不明,可能覺得實現比較簡單。
再看上面的代碼, 由於在這裏精度丟失,實際上我們要實現我們的目的是四捨五入,比較簡單的方法是
int nx = fx *100 + 0.5;
我們應該具有這樣的觀念,浮點數的運算結果應該是在我們精度允許的範圍內是準確的,做強制轉換時應該明確轉換的目的。
另外浮點數的比較判斷:
《c++高級編程》4.3.3浮點變量與零值比較
[規則] 不可將浮點變量用"=="或"!="與任何數值比較
假設浮點變量的命令爲x,應當將
if (x == 0.0)
轉化爲
if( (x >= -epsinon ) && ( x <= epsion ))
epsinon 是允許的誤差。