BigDecimal比较大小

简介: BigDecimal比较大小


BigDecimal比较大小


BigDecimal

BigDecimal,是一种java.math包中提供的一种可以用来进行精确运算的类型,在进行金额表示、金额计算等场景,不能使用double、float等类型,而是要使用对精度支持的更好的BigDecimal。

所以,很多支付、电商、金融等业务中,BigDecimal的使用非常频繁,其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的,代码中还经常需要对于数字进行相等判断。


BigDecimal比较

==比较

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal == bigDecimal1);
//false

有人会犯这种低级错误,用==直接比较肯定是无法得到自己想要的情况的,因为BigDecimal是对象,所以是无法用==来比较两个数字的值是否相等。

== 可以用来比较基本类型的数值,例如:

int a = 1;
int b = 1;
System.out.println(a==b);
//true

image.png


== 用来比较对象,比较的是引用对象的引用地址,例如:

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal == bigDecimal1);
//false

image.png

由于对象的引用地址不一样,所以返回false。


equals 比较

BigDecimal bigDecimal = new BigDecimal(1);
BigDecimal bigDecimal1 = new BigDecimal(1);
System.out.println(bigDecimal.equals(bigDecimal1));
//true
BigDecimal bigDecimal2 = new BigDecimal(1);
BigDecimal bigDecimal3 = new BigDecimal(1.0);
System.out.println(bigDecimal2.equals(bigDecimal3));
//true
BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));
//false

通过结果可以看出BigDecimal在进行equals比较时,有的时候是true(当使用int、double定义BigDecimal时),有的时候是false(当使用String定义BigDecimal时)。

在BigDecimal的JavaDoc注释中提到,equals和compareTo比较不太一样,equals比较时会比较value and scale,所以再来看上面bigDecimal4和bigDecimal5的结果就明白了

image.png

那么为什么用int 、double定义BigDecimal时就一样呢

  • 用int时debug结果图
    image.png
    其中scale和xDec.scale的值都是0
  • 用double时debug结果图
    image.png其中scale和xDec.scale的值都是0
  • 用string时debug结果图
    image.png
    其中bigDecimal4的scale是0,而bigDecimal5的scale是1,这样比较的结果就是false了。

前面,我们解释了BigDecimal的equals方法,其实不只是会比较数字的值,还会对其标度进行比较。

所以,当我们使用equals方法判断判断两个数是否相等的时候,是极其严格的。


compareTo比较

针对上面equals比较比较严格的情况,如果只想比较值呢,BigDecimal为我们提供了compareTo方法。

BigDecimal bigDecimal4 = new BigDecimal("1");
BigDecimal bigDecimal5 = new BigDecimal("1.0");
System.out.println(bigDecimal4.equals(bigDecimal5));
//false
BigDecimal bigDecimal6 = new BigDecimal("1");
BigDecimal bigDecimal7 = new BigDecimal("1.0");
System.out.println(bigDecimal6.compareTo(bigDecimal7));
//0

此时我们看到bigDecimal6和bigDecimal7比较的值为0,即相等。


我们可以看到BigDecimal中compareTo的JavaDoc注释,compareTo只比较值,其中返回结果:-1表示小于,0表示等于,1表示大于

image.png

一般BigDecimal值的比较用compareTo就好,用equals比较的话可能会得到不是你想要的结果而自己又不曾意识到。



相关文章
|
7月前
如何对BigDecimal进行非0判断
如何对BigDecimal进行非0判断
198 3
|
7月前
|
Java
BigDecimal的相关使用
BigDecimal的相关使用
52 1
|
Java API
BigDecimal类型讲解
如何在Java中使用BigDecimal数字类型,你真的掌握了嘛??
129 0
|
3月前
|
Java
BigInteger和BigDecimal18
BigInteger和BigDecimal18
44 3
|
5月前
|
存储 Java 数据库
BigDecimal 用法总结
BigDecimal 用法总结
90 0
|
7月前
|
存储 Java
BigDecimal 详解
BigDecimal 详解
108 8
|
Java API
关于BigDecimal你不知道的那些事儿
在我们平时开发中,涉及到精度计算的逻辑肯定会用到BigDecimal,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。 ————————————————
66 0
关于BigDecimal你不知道的那些事儿
|
7月前
|
Java API
使用 BigDecimal 的正确方式
使用 BigDecimal 的正确方式
100 1
|
存储 Java
BigInteger与BigDecimal类
BigInteger与BigDecimal类
89 0
|
缓存 安全 Java
BigDecimal
BigDecimal
3159 3