java中浮点数值的比较陷阱

我Java学的不明不白,最近又开始从基础看起,在学习的过程中发现了很多的常见错误和陷阱,这里我把它们列出来,以作记录。
1.两个浮点数值的相等测试:


可以看到输出的是flase,不应该是true吗?
原来,这里的a并不是精确等于0.5,而是0.5000…0001,所以可以看出两个浮点数值不能做相等测试,那么应该如何做呢?书上是这样写的:
通过测试两个数的差距小于摸个阈值,来比较他们是否已经足够接近。也就是说,对于一个非常小的值ε,如果|x-y|<ε,那么x与y就非常相近,也就是相等,所以我们的代码应该写成:

可以看到,这样就正确了,但是什么是EPSILON?
EPSILON就是ε,英文:epsilon,常用语表示一个非常小的值。通常,将ε设为10^-14来比较两个double类型的值,而设为10^-7来比较两个float的值。

PS : ε是怎么打出来的呢? Alt + 42693

本文链接:

http://www.tobewh.com/index.php/archives/11/