java decimal 比较大小_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); //除法

655fd294d3f1f7afd339ed80f12719ac.png

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

1. 比较对象是否相等

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

BigDecimal a = BigDecimal.valueOf(“1.0”);

BigDecimal b = BigDecimal.valueOf(“1.000”);

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

结果是false。

96da4935dc7fc5683ea611d3f1f100c7.png

怎么会不相等了呢?

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

f41734e7c0ea1125b01e732a19f896dc.png

可以看到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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值