看板 java 關於我們 聯絡資訊
※ 引述《m3gl4a (m3gl4)》之銘言: : x=0.2 : y=0.19999999999999998 : 在人去看無疑是x=y 可是電腦是x=/=y : 這到底是什麼魔術 : ----- : Sent from JPTT on my Foxconn International Holdings Limited M511. 知道在 Java 中執行1.0 – 0.8的結果是多少嗎?答案不是0.2,而是 0.19999999999999996!為什麼?這是Java的臭蟲(Bug)嗎?不!不是的!你使用別的程 式語言(例如JavaScript、Python等)也有可能是顯示這個結果。 簡單來說,Java(包括其它程式語言)遵合IEEE 754浮點數演算(Floating-point arithmetic)規範,使用分數與指數來表示浮點數。例如0.5會使用1/2來表示,0.75會使 用1/2 + 1/4來表示,0.875會使用1/2 + 1/4 + 1/8來表示,而0.1會使用1/16 + 1/32 + 1/256 + 1/512 +1/4096 + 1/8192 + ...無限循環下去,無法精確表示,因而造成運算上 的誤差。 再來舉個例子,你覺得以下程式片段會顯示什麼結果? double a = 0.1; double b = 0.1; double c = 0.1; if((a + b + c) == 0.3) { System.out.println("等於 0.3"); } else { System.out.println("不等於 0.3"); } 由於浮點數誤差的關係,結果是顯示「不等於0.3」!類似的例子還很多,結論就是,如 果要求精確度,那就要小心使用浮點數,而且別用==直接比較浮點數運算結果。 那麼要怎麼辦得到更好的精確度?可以使用java.math.BigDecimal類別 ... 其他看 http://openhome.cc/Gossip/Java/StandAPI-class.html 以及 https://goo.gl/flvwVn -- 良葛格學習筆記 http://openhome.cc -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.13.135.18 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1431778366.A.80C.html ※ 編輯: JustinHere (39.13.135.18), 05/16/2015 20:14:23
WrongHole: 05/16 22:22
pttworld: 其實是可以丟個IEEE 754讓查的,有關鍵字的提示足夠了。 05/17 03:09
pttworld: 這個版真的很缺少觀念上的文章,唉。 05/17 03:09
beemos: 05/17 11:16
danie372003: 推 05/17 17:27
boluobread: 平常很常看您的教學 推<(_ _)> 05/17 18:14
mrforget: 有神快拜。 05/17 21:39
ho83leo: 推 教得很有理 05/20 22:06
Gain5566: 05/22 10:26
KOBEDIRK: 推良葛格!!!! 06/23 21:20