今天写java,后台报错
java.lang.NumberFormatException: null
报空参数异常,debug到报错的那句代码,发现他传入的参数b的值为空。
当你的代码报这个异常的时候,有两个解决思路:
//a是被除数,b是除数
//b传入参数为空
//c=(a-b)/b
BigDecimal a = new BigDecimal(String.valueOf(map.get("a")));
BigDecimal b = new BigDecimal(String.valueOf(map.get("b")));
BigDecimal c= (a.subtract(b)).divide(b);
自己阅读自己的代码,发现有一个地方的参数名错了,本来传入因为b的,我写成了d,修改一下,运行!
卧槽怎么报错了?
阅读报错信息,报除0错误,b是除数,传入参数不能为0
//a是被除数,b是除数
//b传入参数0
//c=(a-b)/b
BigDecimal a = new BigDecimal(String.valueOf(map.get("a")));
BigDecimal b = new BigDecimal(String.valueOf(map.get("b")));
BigDecimal c= (a.subtract(b)).divide(b);
好了,原来是之前的语句用BigDecimal做了一个除法,除数为0,除0错误,传到这里也就报0异常,给他做一个除数不为0的判断
BigDecimal c;
if (b.equals(BigDecimal.ZERO)){
c=BigDecimal.ZERO;
}
else {
c=(a.subtract(b)).divide(b);
}
修改完成!运行!
卧槽怎么还是报错???
java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result。
阅读后台报错,还是回到这一句
c=(a.subtract(b)).divide(b);
一番查阅,发现原来使用JAVA中如果用BigDecimal做除法时后面要接第二个参数,以限定其精确到小数点后第几位,否则就会无限除下去
修改如下:
//精确到2位
c=(a.subtract(b)).divide(b,2,BigDecimal.ROUND_HALF_UP);
关于 BigDecimal.ROUND_HALF_XX
的用法查看一下这位博主写的,很详细
https://www.cnblogs.com/yingchen/p/5459501.html
注意这个BigDecimal的divide方法有两个重载的方法,一个是传两个参数的,一个是传三个参数的:
当传入两个参数时,传入的是(除数,round的模式)
当传入两个参数时,传入的是(除数,精度,round的模式)
参考链接: