作者JustinHere (良葛格)
看板java
標題Re: [問題] 今天的來演講的老師給了一個很傻眼的問題
時間Sat May 16 20:12:42 2015
※ 引述《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