[問題] 浮點數的誤差嗎??

看板C_and_CPP (C/C++)作者 (小豆豆)時間13年前 (2012/12/04 14:06), 編輯推噓2(2010)
留言12則, 3人參與, 最新討論串1/1
小弟目前遇到的問題是 double xxx; 然後xxx這個變數在程式中會給他一個值, 我cout出來看到的是0.875 而在程式中我想測試此變數取小數三位後能不能被0.005整除, 因此我做了下面的動作 if( ((int)(xxx*1000.0)) % 5 != 0 ) .... 結果發現 0.875 不能被0.005整除 理論上 應該是 875/5 = 175..0 因此我cout了下面的東西: ((int)(xxx*1000)/5) = 174 ((int)(xxx*1000)%5) = 4 (xxx*1000)/5 = 175 好像在取整數的過程 875 變成 874.... 我用printf顯示到小數第六位也是8.750000*e-1 有人可以替小弟解答嗎?? 萬分感激 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.187.225 ※ 編輯: linkone 來自: 140.116.187.225 (12/04 14:08)

12/04 14:21, , 1F
試試看(int)(xxx * 1000.0 + 0.5)
12/04 14:21, 1F

12/04 14:24, , 2F
c取整數是無條件捨去到比較靠近0的那個整數
12/04 14:24, 2F

12/04 14:25, , 3F
有負數用floor(d + 0.5)比較好
12/04 14:25, 3F

12/04 14:27, , 4F
另外double的位數遠超過六位
12/04 14:27, 4F

12/04 14:27, , 5F
你看到的是printf幫你四捨五入的結果
12/04 14:27, 5F

12/04 16:34, , 6F
use nearbyint() : http://ideone.com/T855Ag
12/04 16:34, 6F

12/04 18:08, , 7F
不過樓上那個要c++11才有
12/04 18:08, 7F

12/04 19:30, , 8F
不對吧應該是 round/lround/llround 吧... 然後 C99 就有
12/04 19:30, 8F

12/04 19:37, , 9F
nearbyint 會受到目前進位模式影響,所以L大的說明不完整
12/04 19:37, 9F

12/04 19:39, , 10F
像是 http://ideone.com/hhqOCv (符點數超複雜請看標準)
12/04 19:39, 10F

12/04 19:41, , 11F
(上面的程式碼有對實作假設一些東西... 詳情看標準 orz)
12/04 19:41, 11F

12/04 19:41, , 12F
沒錯 xDD
12/04 19:41, 12F
文章代碼(AID): #1GlPBly4 (C_and_CPP)
文章代碼(AID): #1GlPBly4 (C_and_CPP)