Re: [問題] 今天的來演講的老師給了一個很傻眼的問題
※ 引述《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
推
05/16 22:22, , 1F
05/16 22:22, 1F
推
05/17 03:09, , 2F
05/17 03:09, 2F
→
05/17 03:09, , 3F
05/17 03:09, 3F
推
05/17 11:16, , 4F
05/17 11:16, 4F
推
05/17 17:27, , 5F
05/17 17:27, 5F
推
05/17 18:14, , 6F
05/17 18:14, 6F
推
05/17 21:39, , 7F
05/17 21:39, 7F
推
05/20 22:06, , 8F
05/20 22:06, 8F
推
05/22 10:26, , 9F
05/22 10:26, 9F
推
06/23 21:20, , 10F
06/23 21:20, 10F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章