APP下载
报价宝  ›  科技  › 

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

报价宝 来源:baojiabao.com 发布时间:2019-09-10 04:51:00 09月15日更新
报价宝综合消息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物件大小,相等的判断。

1. 比较物件是否相等

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

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

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

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

结果是false。

怎么会不相等了呢?

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

可以看到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方法则不会比较精确度,只比较数值的大小。

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 手机价格 小米手机价格 红米手机价格 耳机价格 降噪耳机价格