# 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较？

·  阅读 9472

BigDecimal，相信对于很多人来说都不陌生，很多人都知道他的用法，这是一种java.math包中提供的一种可以用来进行精确运算的类型。

``````if(bigDecimal == bigDecimal1){
// 两个数相等
}

``````if(bigDecimal.equals(bigDecimal1)){
// 两个数相等
}

``````BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal.equals(bigDecimal1));

BigDecimal bigDecimal2 = new BigDecimal(1);
BigDecimal bigDecimal3 = new BigDecimal(1.0);
System.out.println(bigDecimal2.equals(bigDecimal3));

BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));

``````true
true
false

### BigDecimal的equals原理

``````Compares this  BigDecimal with the specified Object for equality.  Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by  this method)

### 为什么精度不同

``````BigDecimal(int)
BigDecimal(double)
BigDecimal(long)
BigDecimal(String)

#### BigDecimal(long) 和BigDecimal(int)

``````public BigDecimal(int val) {
this.intCompact = val;
this.scale = 0;
this.intVal = null;
}

public BigDecimal(long val) {
this.intCompact = val;
this.intVal = (val == INFLATED) ? INFLATED_BIGINT : null;
this.scale = 0;
}

### 如何比较BigDecimal

BigDecimal中提供了compareTo方法，这个方法就可以只比较两个数字的值，如果两个数相等，则返回0。

``````    BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0000");
System.out.println(bigDecimal4.compareTo(bigDecimal5));

``````0

### 总结

BigDecimal是一个非常好用的表示高精度数字的类，其中提供了很多丰富的方法。