bigdecimal比较大小(Java面试题之BigDecimal比较大小问题)

BigDecimal

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场了。

如下是BigDecimal提供的加减乘除方法。

public BigDecimal add(BigDecimal value); //加法

public BigDecimal subtract(BigDecimal value); //减法

public BigDecimal multiply(BigDecimal value); //乘法

public BigDecimal divide(BigDecimal value); //除法

Java面试题之BigDecimal比较大小问题

这个类是Java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断。

1. 比较对象是否相等

将String表示形式转换成BigDecimal,举个例子:

BigDecimal a = BigDecimal.valueOf("1.0");

BigDecimal b = BigDecimal.valueOf("1.000");

在现实中这两个数字是相等的,但是如果用a.equals(b) 或 a==b 结果都返回false。

结果是false。

Java面试题之BigDecimal比较大小问题

怎么会不相等了呢?

2. 首先看一下BigDecimal的equals()方法

Java面试题之BigDecimal比较大小问题

可以看到BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值(BigInteger的equals方法)是否一致。

其实javadoc里面就已经写的很明白:

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).

因此,a.equals(b) 方法返回false,是因为精度不一致。

而等于比较符(a==b)是比较内存地址,“1.0”和“1.000”二者内容当然不一样了,并且是2个不同的对象,内存地址也不一样。

3. 再看看compareTo() 方法

if(a.compareTo(b) == 0)结果是true。

javadoc文档中内容:

Compares this {@code BigDecimal} with the specified

* {@code BigDecimal}. Two {@code BigDecimal} objects that are

* equal in value but have a different scale (like 2.0 and 2.00)

* are considered equal by this method.

说明:public int compareTo(BigDecimal val)

将此BigDecimal与指定的BigDecimal进行比较。

两个BigDecimal对象的价值相等但具有不同的精度(如1.0和1.000)被认为是相等的这种方法。

compareTo 定义在Comparable <BigDecimal>

参数:val - BigDecimal要与此BigDecimal进行比较。

返回:-1,0或1,因为BigDecimal数值小于等于或大于val。

最后结论是:对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小。