Re: [問題] 計算精確度的問題

看板Ajax作者 (喵)時間17年前 (2008/01/10 15:48), 編輯推噓1(108)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《fillano (冒牌費大公)》之銘言: : 今天在javaworld看到一個問題,我自己試了一下,發現 : a=0.82; : alert(a+1-1); : 在ie會顯示0.8199999999999998 : 在ff會顯示0.8199999999999998 : 這是什麼原因呢? 這我之前做FLASH的時候也發生同樣的問題 trace出來的值明明就是0.82 可是要他判斷(0.82+1-1)==a的時候 就會傳出false 這是因為二進位的問題 感謝FLASH版的高手給的方向 之後有看到書上說到 0.82要轉換成二進位,由於是純小數,所以要直接乘以2然後取整數部分 剩下的小數部分再乘以2,一直下去 (最後答案是什麼我忘記怎麼表示了 但方法好像就是這樣) 但是這樣的轉換會有沒辦法剛好乘起來是整數,因此就會有無限循環的狀況 剛在excel上面測試0.82這樣一直乘以2,然後取整數,會發現小數會有重複 (另外發現excel也會有出現不精準的狀況) 那其實這樣的數字是很接近很接近原本我們要的十進位數字 因此我在判斷是否相同的時候 會將兩數相減 然後乘以一個倍數 如1000000等 (越大越精準 但不曉得可以精準到什麼地步) 再用四捨五入法去取 最後等於0的話 就代表這兩個數字相當接近 哈 這是我的作法啦 講好多 但是觀念並沒有非常確定 有錯還請指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.19.207.224

01/10 17:02, , 1F
請參看IEEE754號標準。所有的使用浮點數來計算的語言都有這個
01/10 17:02, 1F

01/10 17:03, , 2F
問題﹐如果對精度十分敏感的話﹐可以選擇使用各個語言的大數
01/10 17:03, 2F

01/10 17:04, , 3F
庫﹐即是用字符串來記錄結果﹐但這個效率太成問題。
01/10 17:04, 3F

01/10 17:17, , 4F
所以c/c++的標準函式庫並不使用IEEE754囉?
01/10 17:17, 4F

01/10 18:15, , 5F
一定也是用的IEEE754,不過可能有最終顯示格式的區別。比如
01/10 18:15, 5F

01/10 18:15, , 6F
隻顯示5位有效數字之類的。但不代表它就是"精準的"
01/10 18:15, 6F

01/10 22:38, , 7F
所以通常在運算上不直接比較兩個浮點數是否相等
01/10 22:38, 7F

01/10 22:39, , 8F
而是相減後絕對值小於某個值(如1e-6)就視為相等
01/10 22:39, 8F

01/11 11:23, , 9F
了解,謝啦
01/11 11:23, 9F
文章代碼(AID): #17XStHfs (Ajax)
討論串 (同標題文章)
文章代碼(AID): #17XStHfs (Ajax)