[問題] Javascript 詭異的計算問題

看板Ajax作者 (...)時間11年前 (2013/12/08 06:37), 編輯推噓5(504)
留言9則, 7人參與, 最新討論串1/1
剛發現表單數值有一個詭異的數字: 0.35000000000000003 後來發現竟然是 350 * 0.001 算出來的結果。 多試了幾組數字: 340*0.001=0.34 341*0.001=0.341 342*0.001=0.342 343*0.001=0.343 344*0.001=0.34400000000000003 345*0.001=0.34500000000000003 346*0.001=0.34600000000000003 347*0.001=0.34700000000000003 348*0.001=0.34800000000000003 349*0.001=0.34900000000000003 350*0.001=0.35000000000000003 351*0.001=0.35100000000000003 352*0.001=0.352 353*0.001=0.353 354*0.001=0.354 355*0.001=0.355 為什麼 344 到 351 之間的數字,乘上 0.001 會跑出那樣的結果? 跟二進位近似值什麼的有關嗎? IE, Firefox, Chrome 都一樣。 有沒有什麼規律?該怎麼去掉小數點尾巴那個 3 ? 程式碼 <script> cal=340*0.001; document.write('340*0.001='+cal+'<BR>'); cal=341*0.001; document.write('341*0.001='+cal+'<BR>'); cal=342*0.001; document.write('342*0.001='+cal+'<BR>'); cal=343*0.001; document.write('343*0.001='+cal+'<BR>'); cal=344*0.001; document.write('344*0.001='+cal+'<BR>'); cal=345*0.001; document.write('345*0.001='+cal+'<BR>'); cal=346*0.001; document.write('346*0.001='+cal+'<BR>'); cal=347*0.001; document.write('347*0.001='+cal+'<BR>'); cal=348*0.001; document.write('348*0.001='+cal+'<BR>'); cal=349*0.001; document.write('349*0.001='+cal+'<BR>'); cal=351*0.001; document.write('351*0.001='+cal+'<BR>'); cal=352*0.001; document.write('352*0.001='+cal+'<BR>'); cal=353*0.001; document.write('353*0.001='+cal+'<BR>'); cal=354*0.001; document.write('354*0.001='+cal+'<BR>'); cal=355*0.001; document.write('355*0.001='+cal+'<BR>'); </script> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.25.7 ※ 編輯: anawak 來自: 61.228.25.7 (12/08 06:41)

12/08 10:36, , 1F
個人猜測是rounding error
12/08 10:36, 1F

12/08 11:25, , 2F
浮點數會有精度問題 所有語言都一樣
12/08 11:25, 2F

12/08 12:26, , 3F
運算前先化為整數即可
12/08 12:26, 3F

12/08 12:39, , 4F
樓上... 這邊就是小數運算 化整數要算啥啊...
12/08 12:39, 4F

12/08 12:40, , 5F
總之上面都有推到了 可以的話你改 /1000 就沒這問題了
12/08 12:40, 5F

12/08 13:37, , 6F
這問題標準解之一是轉整數運算沒錯。
12/08 13:37, 6F

12/08 13:40, , 7F
只是要運算的話,抓一下你精度要到小數幾位處理就好。
12/08 13:40, 7F

12/08 14:00, , 8F
用整數算 +1
12/08 14:00, 8F

12/17 03:35, , 9F
Q format.
12/17 03:35, 9F
文章代碼(AID): #1IewCGON (Ajax)
文章代碼(AID): #1IewCGON (Ajax)