java中BigDecimal的equals与compareTo的区别

1、源码比较

1)BigDecimal的equals方法:

public boolean equals(Object x){
	if (!(x instanceof BigDecimal))
	    return false;
	BigDecimal xDec = (BigDecimal) x;

	return scale == xDec.scale && intVal.equals(xDec.intVal);
    }

2)compareTo方法

public int compareTo(BigDecimal val){
	/* Optimization: would run fine without the next three lines */
	int sigDiff = signum() - val.signum();
	if (sigDiff != 0)
	    return (sigDiff > 0 ? 1 : -1);

	/* If signs match, scale and compare intVals */
	BigDecimal arg[] = new BigDecimal[2];
	arg[0] = this;	arg[1] = val;
	matchScale(arg);
	return arg[0].intVal.compareTo(arg[1].intVal);
    

这个方法里面有个matchScale的处理,意思是把精确度低的那个对象转换为高精确度,然后再进行比较。

matchScale的实现如下:

private static void matchScale(BigDecimal[] val) {
	if (val[0].scale < val[1].scale)
	    val[0] = val[0].setScale(val[1].scale);
	else if (val[1].scale < val[0].scale)
	    val[1] = val[1].setScale(val[0].scale);
    }

测试结果如下

System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20")));  //输出false
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //输出true
        
System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); //输出是false
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); //输出是false
   
System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); //输出是true
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);//输出是true

结论:

  1. BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal("0.1");
  2. BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。
  3. BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。
  4. 对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小。

转载于:https://my.oschina.net/idea813/blog/1607402

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值