[問題] 很疑惑的錯誤輸出

看板C_and_CPP作者 (我想飛)時間13年前 (2011/05/04 22:12), 編輯推噓2(2012)
留言14則, 3人參與, 最新討論串1/1
最近在跑一些自己寫的應用程式, 平台是 Linux + g++ 3.4.6 發生了一個錯誤如下: double a = "123456710.0" <-----此數值為計算出來的 而且一定沒有小數部分 long b = (long)a; 此時b的值會變成 "123456709", 這邊的數字不是實際例子, 因為有時候會發生有時候不會 整個摸不著頭緒阿...... 一般把浮點數cast成整數類型不就是把小數點以下給砍掉嗎??? 怎麼結果連整數位 都變掉了?? 請問各位先進幫忙解惑一下 有誰遇過相同的問題嗎??? 謝謝各位~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.197.173

05/04 22:18, , 1F
置底十三誡之十一....
05/04 22:18, 1F

05/04 22:19, , 2F
浮點數無法全都精確的儲存, 有時候你print出來看的值
05/04 22:19, 2F

05/04 22:19, , 3F
是123456710.0(或給的值), 實際上被記錄的數值是
05/04 22:19, 3F

05/04 22:20, , 4F
123456709.9999之類的, cast成整數自然只剩123456709
05/04 22:20, 4F

05/04 22:20, , 5F
值越大可能連整數位都差很多, 以double的mentisa 52bits
05/04 22:20, 5F

05/04 22:22, , 6F
來算, 換算成十進位大約只有15位數左右, float 6位數左
05/04 22:22, 6F

05/04 22:22, , 7F
右@_@"
05/04 22:22, 7F

05/04 22:23, , 8F
另外請參考 冼老師的網站 - http://tinyurl.com/ydblq8z
05/04 22:23, 8F

05/04 22:25, , 9F
題外話, 你怎麼知道一定沒有小數部份?? 除非你dump計算
05/04 22:25, 9F

05/04 22:25, , 10F
過程中每個浮點數結果, 而這還未必一定準....Orz
05/04 22:25, 10F

05/04 22:27, , 11F
阿阿 先回答樓上大大的問題 因為沒有小數是數學上確定的....
05/04 22:27, 11F

05/04 22:30, , 12F
另外先在問一下 整數存成浮點數之後 再cast回來成整數
05/04 22:30, 12F

05/04 22:30, , 13F
這樣結果也不一定跟原來的整數一下囉?? 因為浮點數表示法的
05/04 22:30, 13F

05/04 23:20, , 14F
你先看完冼老師網站那篇文章 有問題再來問
05/04 23:20, 14F
文章代碼(AID): #1DmLwpqo (C_and_CPP)