從乙個bug到了解浮點數

2021-08-19 04:42:30 字數 644 閱讀 5731

有次qa提了乙個bug,就是假如輸入999999.99時候,會發現存到資料庫是1000000。後面一看**原來是自己手抖,平常用double來轉換,突然有個地方寫成了float。改後就ok。但是仔細一想,這個為什麼剛好是這個值轉換出錯,學過計算機的都知道,float儲存用二進位制,所以有精度差,但是究竟是怎樣乙個儲存法呢。大學學到的知識都忘記了。趕緊複習下。

這是基於ieee 754,是ieee二進位浮點數算術標準。

float是單精度,32位,1位符號位,8位exponent指數字,23位是mantissa小數字。

儲存後讀取的值是 2^exponent*mantissa。

輸入的是999999.99, mantissa儲存的是1.90734863281257611392,這是把999999.99轉化成二進位制後,科學計數法的有效數字儲存格式。然後exponent = 146,實際上是146-127 = 19。顯示成146是因為儲存的是移碼。

那麼經過計算,1.9073486328125*2^19= 1,000,000.00000004。儲存二位小數就是1,000,000.00。

用double同樣道理有誤差,只是double是雙精度,要更大的數字才能測試出誤差。由於我們系統正常使用不會超過那個數字,所以就不考慮。另外,對數字計算要求精確的話,請用decimal

關於列印浮點數的乙個問題

在開發專案的時候,需要顯示金額數,例如 99.99 nslog 99.99 但是很坑爹的是,不知道為什麼,列印出來居然是99.98999999999999 2015 09 21 20 51 14.027 test 22562 295012 99.98999999999999很明顯這裡面少了0.000...

由乙個浮點數引發的思考

下面這段 輸出值是多少呢?void main 在我32位的虛擬機器上,列印輸出值是 data 266270.84 為什麼會出現這種情況呢,難道是計算機出問題了。當然不是計算機出現了問題,我們從下面幾點來分析 首先,我們從浮點數在記憶體中的儲存形式來分析。大家都知道,資料在記憶體中是以010101這種...

精確判斷乙個浮點數是否等於0

看到論壇上有人問 精確判斷乙個浮點數是否等於0,不要用if data 1e 10 類似的做法。其實我們了解下計算機中是怎樣儲存浮點數的,這個問題的答案就很明了了。ieee754標準中,單精度浮點數 4byte 表示法 1bit符號位 s 8bit指數字 e,用階碼表示 23bit小數部分 尾數m 雙...