看板 PHP 關於我們 聯絡資訊
※ 引述《chenlifu (離)》之銘言: : 比較運算在有小數點的時候 : 不知道該怎麼解決問題 : 目前要把運算結果分開 : ( a / b < 0.05 ) : ( a / b >= 0.05 AND a / b < 0.1) : ....這類狀況 : 發現當 結果是0.0555的時候 : 會被分類為 <0.05 : 遇到這類運算的時候要怎麼辦? : gettype檢查過值為double : 查官網看到有寫用round : 可是不成功..不太懂那意思 : 可否請教版上大大 : 感恩 浮點數原本就不應該拿來判斷用! 這不是bug, 而是所有的程式語言都共通的現象。 目前最廣泛使用的浮點數標準是IEEE 754這個標準, ﹝使用在CPU跟浮點運算處理器上﹞ 詳見 http://zh.wikipedia.org/wiki/IEEE_754 根據IEEE754的標準, +-+--------+-----------------------+ |S| Exp | Fraction | +-+--------+-----------------------+ 第一個位元是符號位元,接著是指數跟小數的部份。 注意到重點了嗎,浮點數是以小數儲存數值的。 但是如果有修過計概或邏輯設計應該知道一個重點, 電腦儲存資料是以二進位儲存, 但是二進位在表示小數的時候沒有辦法表示精確數, 只能做到接近精確。 ex: 0.5(DEC) = 0.1(BIN) 0.25(DEC) = 0.01(BIN) 0.125(DEC) = 0.001(BIN) 所以 0.875(DEC) = 0.111(BIN) 那當你要表達的數字不在二進位能夠精確的表達的範圍, 就只能求出一個逼近的數值, 0.99999999999999999(DEC) ~= 0.11111111111111111111111111111111111111111111111111(BIN) 請注意我用的符號是約等於(~=)而不是等於(=) 換言之,當你拿浮點數進行判斷,結果本身就是不可靠的。 如果有興趣可參閱下列資料 ※Misra-C 2004 6-10 ※Binary numeral system http://en.wikipedia.org/wiki/Binary_numeral_system ※IEEE 754 http://zh.wikipedia.org/wiki/IEEE_754 ※DECIMAL-TO-BINARY FRACTION CONVERTER http://www.ece.umd.edu/~yavuz/software/arithmetic/DectoBinaryFracConverter.htm 另外C_and_Cpp版搜尋浮點數也有不少文章可以參考:) -- ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ 國 立 聯 合 大 學 (理工/電資/管理/技術/客家)院所 招生中 National United University ─────────────────────────────────── 首頁 http://www.nuu.edu.tw BBS telnet://uun.twbbs.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.145.202
foxzgerald :增廣見聞阿 :) 10/29 20:59
gpmm :好文就是要推! 10/29 22:26
kalz :推IEEE754 XD 10/30 09:06