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 是允許的誤差。
PHP 浮點數操作
f 3.14159 使用sprintf對浮點數小數點後三位四捨五入 f new sprintf 3f f echo 3.14159小數點後三位四捨五入 f new.f round round f,3 echo 3.14159小數點後三位四捨五入 round函式 f round.進一法取浮點數的整數 ...
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...
浮點數比較
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...