我们用一个for循环对0.1进行9次相加赋值给a;再将0.1*9赋值给b;按道理来说,用“==”对a与b进行判断。a应该是等于b的,我们运行一下看下结果
public class myclass {
public static void main(String[] args) {
double a=.0;
for(int i=1;i<=9;i++) {
a += .1;
}
double b=.1*9;
System.out.println(a==b);
}
}
意料之外,结果是false:
![](https://img-blog.csdnimg.cn/img_convert/3126c2b3e3a631fc037b2ebc379d52a4.png)
单独将a,b打印出来:
![](https://img-blog.csdnimg.cn/img_convert/8304a31492d857079704deeb086c494d.png)
发现a并不等于预期中的0.9,这是为什么呢?
因为在计算机内存中,存储浮点数(单精度float和双精度double)时使用的是IEEE 754标准,就会有精度问题,在储存和准换的过程中浮点数容易引起一些较小的舍入误差。
所以我们不能使用“==”这种严格意义上的相等 来比较浮点数
如何比较浮点数呢?
方法一:
使用Math.abs()来计算两个浮点数之间的差异,如果这个差异在阈值之内,我们就认为这两个浮点数相等
public class caogao {
public static void main(String[] args) {
final double THRESHOLD=0.001;
double a=.0;
for(int i=1;i<=9;i++) {
a += .1;
}
double b=.1*9;
if(Math.abs(a-b)<THRESHOLD) {
System.out.println("a与b相等");
}else {
System.out.println("a与b不等");
}
}
}
![](https://img-blog.csdnimg.cn/img_convert/e3b671855e0520bb0eb24c7530417ff2.png)
方法二:
使用BigDecimal类,可以指定要舍入的模式和精度,这样就可以解决舍入的误差,可以使用BigDecimal类的compereTo()方法对两个数进行比较,该方法将会忽略小数点后的位数。
import java.math.BigDecimal;
public class caogao {
public static void main(String[] args) {
BigDecimal a=new BigDecimal("2.1");
BigDecimal b=new BigDecimal("2.10");
System.out.println(a.compareTo(b)==0);
//如果a=b,则a.compareTo(b)的结果为0,否则则为-1
}
}
![](https://img-blog.csdnimg.cn/img_convert/f47fe6b376c6c1fa45d4186268a13f5d.png)
注意:不要使用equals()方法对两个BigDecimal对象进行比较,因为equals()方法会考虑位数,位数不相等则返回false,尽管数值上是相等的。
import java.math.BigDecimal;
public class caogao {
public static void main(String[] args) {
BigDecimal a=new BigDecimal("2.1");
BigDecimal b=new BigDecimal("2.10");
System.out.println(a.equals(b));
}
}
![](https://img-blog.csdnimg.cn/img_convert/49d905803d8317af9bc34e71a64ce30f.png)