浮点数不能用“==”比较

我们用一个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:

单独将a,b打印出来:

发现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不等");

}

}

}

方法二:

使用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

}

}

注意:不要使用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));

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值