在上一篇文章 《java中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进行处理了
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()方法,不使用科学计数法进行输出。
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
}
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的值不一定等于小数位数
}
int intValue() 返回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
}
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)
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
}
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,否则抛出异常
}
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,否则抛出异常
}
方式一:
个人觉得用这种方式获取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
}