有人情味的网站,免费制作广州网站,感叹号分销系统,专业软件开发培训机构系列文章目录
java中BigDecimal的介绍及使用#xff0c;BigDecimal格式化#xff0c;BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…系列文章目录
java中BigDecimal的介绍及使用BigDecimal格式化BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int scale()2.4、intValue()2.5、intValueExact()2.6、unscaledValue()2.7、remainder(BigDecimal divisor)2.8、divideAndRemainder(BigDecimal divisor) 三、进阶3.1、获取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,647long-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());//10System.out.println(b); //100000System.out.println(b.stripTrailingZeros()); //1E5 注意返回的值可能已经是个科学计数法了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());//1System.out.println(b.signum());//-1System.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());//2System.out.println(b.scale());//1System.out.println(c.scale());//0System.out.println(dd.scale());//-12345000System.out.println(d.stripTrailingZeros()d.stripTrailingZeros().scale());//-1.2345E6 -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());//-1294967297System.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());//-2147483648System.out.println(b.intValueExact());//抛异常
}执行结果
-2147483648
Exception in thread main java.lang.ArithmeticException: Overflowat 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());//10235System.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 0a new BigDecimal(10.23);System.out.println(a.remainder(new BigDecimal(2)));//10.23%2 0.23System.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(\\.).length1?:money.split(\\.)[1]; //小数部分System.out.println(integer);//10System.out.println(point);//23
}