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); //除法

ed41c914257fb12971b8a2ef3d539167.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。

c92f6e892a8ee8ba2b97ce170153269a.png

怎么会不相等了呢?

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

336d06407110ab3468fffcb98320460b.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方法则不会比较精确度,只比较数值的大小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java BigDecimal是Java中用于高精度计算的类。它允许我们进行任意精度的数字计算,而不会出现舍入误差。 在Java中,基本数据类型(如int、double等)的计算是有限制的。例如,double类型只能存储15位有效数字,而且在计算过程中可能会出现舍入误差。这在需要精确计算的场合下是不可接受的,这就需要使用BigDecimal类。 以下是一些Java BigDecimal的常用方法: 1. 实例化BigDecimal对象 可以使用BigDecimal的构造函数来实例化一个对象,例如: ``` BigDecimal num1 = new BigDecimal("1234.5678"); BigDecimal num2 = new BigDecimal(9876.5432); ``` 2. 加法、减法、乘法和除法 可以使用add()、subtract()、multiply()和divide()方法进行加、减、乘和除运算,例如: ``` BigDecimal result1 = num1.add(num2); BigDecimal result2 = num1.subtract(num2); BigDecimal result3 = num1.multiply(num2); BigDecimal result4 = num1.divide(num2, 2, RoundingMode.HALF_UP); // 保留两位小数 ``` 3. 取反、取绝对值、取反余弦等 可以使用negate()、abs()、acos()等方法进行相应的计算,例如: ``` BigDecimal result5 = num1.negate(); // 取反 BigDecimal result6 = num1.abs(); // 取绝对值 BigDecimal result7 = new BigDecimal(Math.PI).acos(); // 取反余弦 ``` 4. 比较大小 可以使用compareTo()方法进行大小比较,例如: ``` int cmp = num1.compareTo(num2); if (cmp > 0) { System.out.println("num1 > num2"); } else if (cmp < 0) { System.out.println("num1 < num2"); } else { System.out.println("num1 = num2"); } ``` 以上是Java BigDecimal的一些常用方法,使用BigDecimal类可以很方便地进行高精度计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值