java中BigDecimal的介绍及使用(二)

系列文章目录

一、前言

在上一篇文章 《java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题 》 中主要介绍了BigDecimal的加减乘除运算及格式化方面的使用,本篇主要介绍其他相关的内容。

二、BigDecimal提供的方法

加减乘除等常用的方法在上一篇中已经提过,本篇不再重复写,主要讲一下其他可能用到的方法

方法 含义
BigDecimal stripTrailingZeros() 去除小数尾部所有的0,并返回一个BigDecimal类型的数据,不能保证不是科学计数法
int signum() 返回BigDecimal的正负号, 1:正数 0:零 -1:负数
int scale() 该方法返回此BigDecimal的小数位数。对于零或正值,小数位数是小数点右边的位数。对于负值,数字的未标度值乘以十,即标度取反的幂。
int intValue() 返回int数值,小数点后面的数值直接省略
int intValueExact() 返回int数值,小数点后面的数值直接省略,若BigDecimal对象的值超出int类型取值范围,抛出异常
BigInteger toBigInteger() 返回BigInteger数值,BigInteger理论上是负无穷到正无穷之间
BigInteger unscaledValue() 此方法返回一个BigInteger,其值是此BigDecimal值的未缩放值。
divide(BigDecimal) BigDecimal对象中的值相除,返回BigDecimal对象。该方法可能会遇到无限精度问题,会抛出异常,使用时需注意。详细见上一篇文章的无限精度的坑
BigDecimal remainder(BigDecimal divisor) 返回当前BigDecimal对象除以divisor后的余数。 被除数divisor不能是0否则抛出异常
BigDecimal[] divideAndRemainder(BigDecimal divisor) 返回当前BigDecimal对象除以divisor后的商和余数,以数组形式返回。被除数divisor不能是0否则抛出异常

int、BigInteger、long取值范围

类型 取值范围
int -2,147,483,648 到 2,147,483,647
long -9223372036854775808~9223372036854775807

BigInteger 任意大的整数,其取值范围在负无穷到正无穷之间,原则上是,只要你的计算机的内存足够大,可以有无限位的, 当数值超过long之后就要用BigInteger进行处理了

2.1、stripTrailingZeros() 去除小数尾部所有的0

BigDecimal stripTrailingZeros() 去除小数尾部所有的0,并返回一个BigDecimal类型的数据,不能保证不是科学计数法
0.20—>0.2
10.00—>10
100—>100

public static void main(String[] args) {
      BigDecimal a= new BigDecimal("10.000");
      BigDecimal b = new BigDecimal("100000");
      BigDecimal c = new BigDecimal("10.10");
      System.out.println(a.stripTrailingZeros().toPlainString());//10
      System.out.println(b); //100000
      System.out.println(b.stripTrailingZeros()); //1E+5   注意:返回的值可能已经是个科学计数法了
      System.out.println(c.stripTrailingZeros().toPlainString());//10.1
}

当stripTrailingZeros()返回科学计数法时,可以通过toPlainString()方法,不使用科学计数法进行输出。

2.2、int signum()

int signum() 返回BigDecimal的正负号, 1:正数 0:零 -1:负数 用于判断BigDecimal对象是正数,负数,还是零

public static void main(String[] args) {
      BigDecimal a= new BigDecimal("10");
       BigDecimal b = new BigDecimal("-5");
       BigDecimal c = new BigDecimal("0");
       System.out.println(a.signum());//1
       System.out.println(b.signum());//-1
       System.out.println(c.signum());//0
}

2.3、int scale()

int scale() 该方法返回此BigDecimal的小数位数。

  • 对于零或正值,小数位数是小数点右边的位数。
  • 对于负值,数字的未标度值乘以十,即标度取反的幂。 注意:当BigDecimal的对象为科学计数法时,scale的值不一定等于小数位数
public static void main(String[] args) {
      BigDecimal a= new BigDecimal("10.00");
       BigDecimal b = new BigDecimal("-5.1");
       BigDecimal c = new BigDecimal("-174");
       BigDecimal d = new BigDecimal("-1234500");
       System.out.println(a.scale());//2
       System.out.println(b.scale());//1
       System.out.println(c.scale());//0
       System.out.println(d+"====="+d.scale());//-1234500=====0
       System.out.println(d.stripTrailingZeros()+"====="+d.stripTrailingZeros().scale());//-1.2345E+6=====  -2  注意:当BigDecimal的对象为科学计数法时,scale的值不一定等于小数位数
}

2.4、intValue()

int intValue() 返回int数值,小数点后面的数值直接省略

注意

  • int类型的取值范围是-2,147,483,648 到 2,147,483,647所以当超过这个数值时会从负值开始继续转换
  • 可以使用intValueExact()方法,当超出int取值范围后会抛异常
public static void main(String[] args) {
       BigDecimal a= new BigDecimal("2999999999.99");
       BigDecimal b = new BigDecimal("2147483649");
       System.out.println(a.intValue());//-1294967297
       System.out.println(b.intValue());//-2147483647
}

2.5、intValueExact()

int intValueExact() 返回int数值,小数点后面的数值直接省略,若BigDecimal对象的值超出int类型取值范围,抛出异常
int取值范围是-2,147,483,648 到 2,147,483,647,当超过这个范围时抛出异常

以下示例可以看出intValue() 与intValueExact() 的区别

public static void main(String[] args) {
       BigDecimal a= new BigDecimal("2147483648");
       BigDecimal b = new BigDecimal("2147483648");
       System.out.println(a.intValue());//-2147483648
       System.out.println(b.intValueExact());//抛异常
}

执行结果:

-2147483648
Exception in thread "main" java.lang.ArithmeticException: Overflow
	at java.math.BigDecimal.intValueExact(BigDecimal.java:3152)
	at com.ruoyi.common.utils.money.Test1.main(Test1.java:12)

2.6、unscaledValue()

BigInteger unscaledValue() 此方法返回一个BigInteger,其值是此BigDecimal值的未缩放值。
总结一下就是返回没有小数点的金额,该值计算(此* 10this.scale())。如10.235–>10235 0.32—>32

public static void main(String[] args) {
      BigDecimal a = new BigDecimal("10.235");
       BigDecimal b = new BigDecimal("0.32");
       System.out.println(a.unscaledValue());//10235
       System.out.println(b.unscaledValue());//32
}

2.7、remainder(BigDecimal divisor)

BigDecimal remainder(BigDecimal divisor) | 返回当前BigDecimal对象除以divisor后的余数。被除数divisor不能是0否则抛出异常

public static void main(String[] args) {
       BigDecimal a = new BigDecimal("10");
       System.out.println(a.remainder(new BigDecimal("2")));// 10%2 =  0
       a= new BigDecimal("10.23");
       System.out.println(a.remainder(new BigDecimal("2")));//10.23%2 = 0.23
      
       System.out.println(a.remainder(new BigDecimal("0")));//被除数不能是0,否则抛出异常
}

执行结果如下:
在这里插入图片描述

2.8、divideAndRemainder(BigDecimal divisor)

BigDecimal[] divideAndRemainder(BigDecimal divisor) 返回当前BigDecimal对象除以divisor后的商和余数,以数组形式返回。被除数divisor不能是0否则抛出异常

注意:返回的数值会有小数点位数的问题
10.00 ➗ 2 = 5.00
10.00 ➗ 2.000 = 5

public static void main(String[] args) {
      BigDecimal a = new BigDecimal("10");
       BigDecimal[] arr = a.divideAndRemainder(new BigDecimal("2"));
       System.out.println(Arrays.asList(arr));//[5, 0]

       a= new BigDecimal("10.23");
       arr = a.divideAndRemainder(new BigDecimal("2"));
       System.out.println(Arrays.asList(arr));//[5.00, 0.23]

       a= new BigDecimal("10.23");
       arr = a.divideAndRemainder(new BigDecimal("2.000"));
       System.out.println(Arrays.asList(arr));//[5, 0.230]

       System.out.println(a.divideAndRemainder(new BigDecimal("0")));//被除数不能是0,否则抛出异常
}

在这里插入图片描述

三、进阶

3.1、获取BigDecimal整数部分、小数部分、整数位数、小数位数

方式一:

个人觉得用这种方式获取BigDecimal整数部分、小数部分、整数位数、小数位数比较方便

public static void main(String[] args) {
      BigDecimal a = new BigDecimal("10.23");
       String money = a.toPlainString();
       String integer = String.valueOf(a.toBigInteger());//整数部分
       String point = money.split("\\.").length==1?"":money.split("\\.")[1]; //小数部分
       System.out.println(integer);//10
       System.out.println(point);//23
}

猜你喜欢

转载自blog.csdn.net/weixin_49114503/article/details/134548795