作者jonathanmeow (喵)
看板Ajax
標題Re: [問題] 計算精確度的問題
時間Thu Jan 10 15:48:32 2008
※ 引述《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
1F:→ sly9:請參看IEEE754號標準。所有的使用浮點數來計算的語言都有這個 01/10 17:02
2F:→ sly9:問題﹐如果對精度十分敏感的話﹐可以選擇使用各個語言的大數 01/10 17:03
3F:→ sly9:庫﹐即是用字符串來記錄結果﹐但這個效率太成問題。 01/10 17:04
4F:→ fillano:所以c/c++的標準函式庫並不使用IEEE754囉? 01/10 17:17
5F:→ sly9:一定也是用的IEEE754,不過可能有最終顯示格式的區別。比如 01/10 18:15
6F:→ sly9:隻顯示5位有效數字之類的。但不代表它就是"精準的" 01/10 18:15
7F:推 LPH66:所以通常在運算上不直接比較兩個浮點數是否相等 01/10 22:38
8F:→ LPH66:而是相減後絕對值小於某個值(如1e-6)就視為相等 01/10 22:39
9F:→ fillano:了解,謝啦 01/11 11:23