javanull⽐较⼤⼩_JavaBigDecimal使⽤及基本运算(推荐)BigDecimal简介
Java在java.math包中提供的API类BigDecimal,⽤来对超过16位有效位的数进⾏精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应⽤中,需要对更⼤或者更⼩的数进⾏运算和处理。float和double只能⽤来做科学计算或者是⼯程计算,在商业计算中要⽤java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使⽤传统的+、-、*、/等算术运算符直接对其对象进⾏数学运算,⽽必须调⽤其相对应的⽅法。⽅法中的参数也必须是BigDecimal的对象。构造器是类的特殊⽅法,专门⽤来创建对象,特别是带有参数的对象。
提起BigDecimal,相信⼤家都使⽤过,之所以总结这篇呢,是因为最近发现项⽬中使⽤的不是太规范,在某些场景下甚⾄出现代码抛出异常的情况,
所以就总结了这篇,希望⼤家在使⽤时,可以少踩⼀些坑。
1. 基本运算
1.1 加法
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.add(number2);
System.out.println("number1 add number2 = " + number3);
输出结果:
number1 add number2 = 100.00
1.2 减法
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.subtract(number2);
System.out.println("number1 subtract number2 = " + number3);
输出结果:
number1 subtract number2 = 77.76
1.3 乘法
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.multiply(number2);
System.out.println("number1 multiply number2 = " + number3);
java网课推荐输出结果:
number1 multiply number2 = 988.3456
1.4 除法
BigDecimal number1 = new BigDecimal("88");
BigDecimal number2 = new BigDecimal("11");
BigDecimal number3 = number1.divide(number2);
System.out.println("number1 divide number2 = " + number3);
输出结果:
number1 divide number2 = 8
因为上⾯2个数可以整除,所以这么⽤没有问题,不过⼀但不能被整除,这么⽤就会有潜在的风险,会抛出java.lang.ArithmeticException 异常,所以强烈建议像下⾯这样使⽤:
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.divide(number2, 2, RoundingMode.HALF_UP);
System.out.println("number1 divide number2 = " + number3);
输出结果:
number1 divide number2 = 7.99
此时使⽤的divide()⽅法源码如下所⽰:
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
return divide(divisor, scale, roundingMode.oldMode);
}
这⾥的scale指的是要保留的⼩数位数,我们传的是2,即保留2位⼩数。
这⾥的roundingMode指的是舍⼊模式,我们这⾥传的是RoundingMode.HALF_UP,即经常使⽤的四舍五⼊模式。
1.5 保留⼩数位数
如果我们想对BigDecimal类型保留⼩数位数,可以使⽤setScale()⽅法,使⽤⽅法如下所⽰:
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.multiply(number2);
System.out.println("number1 multiply number2 = " + number3);
// 保留3位⼩数,四舍五⼊
BigDecimal number4 = number3.setScale(3, RoundingMode.HALF_UP);
System.out.println("number3 setScale = " + number4);
输出结果:
number1 multiply number2 = 988.3456
number3 setScale = 988.346
1.6 ⽐较⼤⼩
BigDecimal⽐较⼤⼩,可以使⽤compareTo()⽅法,使⽤⽅法如下所⽰:
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = new BigDecimal("11.11");
BigDecimal number3 = new BigDecimal("99.99");
BigDecimal number4 = new BigDecimal("88.88");
System.out.println("number1 compareTo number2 = " + number1pareTo(number2));
System.out.println("number1 compareTo number3 = " + number1pareTo(number3));
System.out.println("number1 compareTo number4 = " + number1pareTo(number4));
输出结果:
number1 compareTo number2 = 1
number1 compareTo number3 = -1
number1 compareTo number4 = 0
由输出结果可以看出:
当number1⼩于number2时,返回-1,
当number1等于number2时,返回0,
当number1⼤于number2时,返回1。
2. 踩坑总结
2.1 NullPointerException异常
在使⽤BigDecimal类型进⾏计算时,⽐如上⾯提到的加、减、乘、除、⽐较⼤⼩时,⼀定要保证参与计算的两个值不能为空,否则会抛出java.lang.NullPointerException异常。
⽐如下⾯的2段代码,都会抛出异常:
BigDecimal number1 = null;
BigDecimal number2 = new BigDecimal("11.12");
BigDecimal number3 = number1.add(number2);
System.out.println("number1 add number2 = " + number3);
BigDecimal number1 = new BigDecimal("88.88");
BigDecimal number2 = null;
BigDecimal number3 = number1.add(number2);
System.out.println("number1 add number2 = " + number3);
抛出的异常如下图所⽰:
2.2 ArithmeticException异常
⼀次在使⽤BigDecimal的divide⽅法时,抛出java.lang.ArithmeticException异常,错误代码如下所⽰:
// 含税⾦额
BigDecimal inclusiveTaxAmount = new BigDecimal("1000");
// 税率
BigDecimal taxRate = new BigDecimal("0.13");
// 不含税⾦额 = 含税⾦额 / (1+税率)
BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate));
System.out.println(exclusiveTaxAmount);
运⾏时抛出以下异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
报错原因是因为⽆法整除,导致结果是⽆限循环⼩数:
解决⽅案是指定下舍⼊模式,⽐如我们最常⽤的四舍五⼊模式:
// 不含税⾦额 = 含税⾦额 / (1+税率)
BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate),RoundingMode.HALF_UP);
此时不再报错,输出结果为:
885
但这⾥我的需求是保留2位⼩数,四舍五⼊,因此代码应该是下⾯这样的:
// 不含税⾦额 = 含税⾦额 / (1+税率)
BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate), 2, RoundingMode.HALF_UP);此时的输出结果为:
884.96
如果你的IDEA装了阿⾥巴巴代码规范插件,如果不指定RoundingMode,会有下⾯这样的提⽰:
3. 使⽤规范
尽量不要在项⽬中使⽤new BigDecimal("0"),⽽是使⽤BigDecimal提供的常量BigDecimal.ZERO。
BigDecimal zero = BigDecimal.ZERO;
BigDecimal one = BigDecimal.ONE;
BigDecimal ten = BigDecimal.TEN;
总结
到此这篇关于Java BigDecimal使⽤指南针(推荐)的⽂章就介绍到这了,更多相关Java BigDecimal使⽤内容请搜索云海天教程以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持云海天教程!
原⽂链接:blog.csdn/zwwhnly/article/details/108273779
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论