BigDecimal⼯具类,仅此⼀篇⾜以
前⾔
需要计算的场景绕不过去会使⽤BigDecimal类,可频繁的判空让代码可读性下降也使代码冗余度增⾼,不判空⼜容易报空指针异常,⽽且有些场景下的计算,结果为空时需要返回null,所以也不可以将将BigDecimal类型的值都初始化为0,会让运算结果产⽣歧义。为解决上述痛点,于是整理了⼀个⼯具类供所有项⽬⼀起使⽤
⼯具类⽀持功能
1. 加减乘除、累加、倍数运算。
2. Integer、Long、Float、Double、String、Object转为BigDecimal。
3. 除法四舍五⼊并默认保留20位⼩数点。
4. BigDecimal转为String字符串,并禁⽌⽤科学计数法显⽰结果。
5. ⼩数点位数保留。
6. 多种数据类型间混合运算(如Double和Long转为BigDecimal运算)
7. 以上所有计算,⽀持所有⼊参为空时运算
⼯具类源码
import java.math.BigDecimal;
/**
* @author dengcs
* @description: BigDecimal运算⼯具类
* @create 2020-10-10 14:14
*/
public class DecimalUtils {
/**
* 加法计算(result = x + y)
*
* @param x 被加数(可为null)
* @param y 加数(可为null)
* @return 和(可为null)
* @author dengcs
*/
public static BigDecimal add(BigDecimal x, BigDecimal y) {
if (x == null) {
return y;
}
if (y == null) {
return x;
}
return x.add(y);
}
/**
* 加法计算(result = a + b + c + d)
*
* @param a 被加数(可为null)
* @param b 加数(可为null)
* @param c 加数(可为null)
bigdecimal除法保留小数* @param d 加数(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal add(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d) {
BigDecimal ab = add(a, b);
BigDecimal cd = add(c, d);
BigDecimal cd = add(c, d);
return add(ab, cd);
}
/**
* 累加计算(result=x + result)
*
* @param x 被加数(可为null)
* @param result 和(可为null,若被加数不为为null,result默认值为0)
* @return result 和(可为null)
* @author dengcs
*/
public static BigDecimal accumulate(BigDecimal x, BigDecimal result) {
if (x == null) {
return result;
}
if (result == null) {
result = new BigDecimal("0");
}
return result.add(x);
}
/**
* 减法计算(result = x - y)
*
* @param x 被减数(可为null)
* @param y 减数(可为null)
* @return BigDecimal 差(可为null)
* @author dengcs
*/
public static BigDecimal subtract(BigDecimal x, BigDecimal y) {
if (x == null || y == null) {
return null;
}
return x.subtract(y);
}
/**
* 乘法计算(result = x × y)
*
* @param x 乘数(可为null)
* @param y 乘数(可为null)
* @return BigDecimal 积
* @author dengcs
*/
public static BigDecimal multiply(BigDecimal x, BigDecimal y) {
if (x == null || y == null) {
return null;
}
return x.multiply(y);
}
/
**
* 除法计算(result = x ÷ y)
*
* @param x 被除数(可为null)
* @param y 除数(可为null)
* @return 商(可为null,四舍五⼊,默认保留20位⼩数)
* @author dengcs
*/
public static BigDecimal divide(BigDecimal x, BigDecimal y) {
if (x == null || y == null || ypareTo(BigDecimal.ZERO) == 0) {
return null;
}
// 结果为0.000..时,不⽤科学计数法展⽰
return stripTrailingZeros(x.divide(y, 20, BigDecimal.ROUND_HALF_UP));
return stripTrailingZeros(x.divide(y, 20, BigDecimal.ROUND_HALF_UP)); }
/**
* 转为字符串(防⽌返回可续计数法表达式)
*
* @param x 要转字符串的⼩数
* @return String
* @author dengcs
*/
public static String toPlainString(BigDecimal x) {
if (x == null) {
return null;
}
PlainString();
}
/**
* 保留⼩数位数
*
* @param x ⽬标⼩数
* @param scale 要保留⼩数位数
* @return BigDecimal 结果四舍五⼊
* @author dengcs
*/
public static BigDecimal scale(BigDecimal x, int scale) {
if (x == null) {
return null;
}
return x.setScale(scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 整型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal toBigDecimal(Integer x) {
if (x == null) {
return null;
}
return new String());
}
/
**
* 长整型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal toBigDecimal(Long x) {
if (x == null) {
return null;
}
return new String());
}
/**
* 双精度型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
* @author dengcs
*/
public static BigDecimal toBigDecimal(Double x) {
if (x == null) {
return null;
}
return new String());
}
/**
* 单精度型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal toBigDecimal(Float x) {
if (x == null) {
return null;
}
return new String());
}
/**
* 字符串型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal toBigDecimal(String x) {
if (x == null) {
return null;
}
return new BigDecimal(x);
}
/**
* 对象类型转为BigDecimal
*
* @param x(可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal toBigDecimal(Object x) {
if (x == null) {
return null;
}
BigDecimal result = null;
try {
result = new String());
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 倍数计算,⽤于单位换算
*
* @param x ⽬标数(可为null)
* @param multiple 倍数 (可为null)
* @return BigDecimal (可为null)
* @author dengcs
*/
public static BigDecimal multiple(BigDecimal x, Integer multiple) {
public static BigDecimal multiple(BigDecimal x, Integer multiple) {
if (x == null || multiple == null) {
return null;
}
return DecimalUtils.multiply(x, toBigDecimal(multiple));
}
/**
* 去除⼩数点后的0(如: 输⼊1.000返回1)
*
* @param x ⽬标数(可为null)
* @return
*/
public static BigDecimal stripTrailingZeros(BigDecimal x) {
if (x == null) {
return null;
}
return x.stripTrailingZeros();
}
}
如何使⽤
使⽤BigDecimal计算的时候,再也不⽤考虑判空、初始化数值了。代码简洁清爽了许多。
public static void main(String[] args) {
// 定义两个变量,进⾏运算
BigDecimal a = new BigDecimal("100");
BigDecimal b = new BigDecimal("3.14");
// 加 a+b
BigDecimal c1 = DecimalUtils.add(a, b);
// 减 a-b
BigDecimal c2 = DecimalUtils.subtract(a, b);
/
/ 乘 a*b
BigDecimal c3 = DecimalUtils.multiply(a, b);
// 除 a/b
BigDecimal c4 = DecimalUtils.subtract(a, b);
// 累加 sum = a + sum
BigDecimal sum = null;
sum = DecimalUtils.accumulate(a, sum);
// 将变量a结果保留2位⼩数
BigDecimal c5 = DecimalUtils.scale(a, 2);
// 变量a的1000倍运算 a*1000
BigDecimal c6 = DecimalUtils.multiple(a, 1000);
/
/Integer、Long、Float、Double、String、Object转为BigDecimal。
Object obj = 123;
BigDecimal c7 = BigDecimal(obj);
// BigDecimal转为字符串
String str = PlainString(a);
// 不同数据类型之间混合运算(如:Double类型除以Long类型)
BigDecimal mixCalc = DecimalUtils.BigDecimal(1.23D),BigDecimal(1234567L));
}
写在最后
BigDecimal是Java常⽤的计算⼯具,使⽤本⼯具类简化了你重复代码的编写,只需要关注业务逻辑即可,不必担⼼空指针的处理了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论