作者mosquito520 ( )
看板PHP
標題Re: [請益] 小數點的比較運算
時間Wed Oct 29 19:57:51 2008
※ 引述《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