作者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://webptt.com/cn.aspx?n=bbs/java/M.1431778366.A.80C.html
※ 编辑: JustinHere (39.13.135.18), 05/16/2015 20:14:23
1F:推 WrongHole: 05/16 22:22
2F:推 pttworld: 其实是可以丢个IEEE 754让查的,有关键字的提示足够了。 05/17 03:09
3F:→ pttworld: 这个版真的很缺少观念上的文章,唉。 05/17 03:09
4F:推 beemos: 05/17 11:16
5F:推 danie372003: 推 05/17 17:27
6F:推 boluobread: 平常很常看您的教学 推<(_ _)> 05/17 18:14
7F:推 mrforget: 有神快拜。 05/17 21:39
8F:推 ho83leo: 推 教得很有理 05/20 22:06
9F:推 Gain5566: 05/22 10:26
10F:推 KOBEDIRK: 推良葛格!!!! 06/23 21:20