BigDecimal a = new BigDecimal(100);
BigDecimal b = newBigDecimal(2);
一.加减乘除取余运算:四舍五入保留两位小数
1.加法
BigDecimal add = a.add(b).setScale(2, BigDecimal.ROUND_HALF_UP);
2.减法
BigDecimal subtract = a.subtract(b).setScale(2, BigDecimal.ROUND_HALF_UP);
3.乘法
BigDecimal multiply = a.multiply(b).setScale(3, BigDecimal.ROUND_HALF_UP);
4.除法
BigDecimal divide = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);
如果直接使用a.divide(b)除法,有时会报除不尽异常,如下:
BigDecimal a = new BigDecimal(10);
BigDecimal b = new BigDecimal(3);
a = a.divide(b);
错误会报如下异常:java.lang.ArithmeticException: Non-terminating decimal
expansion; no exact representable decimal result.
5.取余
BigDecimal[] bigDecimals = a.divideAndRemainder(b);
返回一个BigDecimal数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数。
注:加减乘除取余a,b都不能为空,否则会产生 Exception in thread "main" java.lang.NullPointerException
二.BigDecimal 处理小数
四舍五入保留两位小数
setScale(2, BigDecimal.ROUND_HALF_UP)
setScale()
setScale(1) 表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入(5则向上入),2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入(5则向下舍),2.35变成2.3
三.比较运算
BigDecimal可以通过compareTo方法来进行比较。
返回的结果是int类型,-1表示小于,0是等于,1是大于。
if(a.compareTo(b) == -1){
System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
System.out.println("a小于等于b");
}
四.BigDecimal常用方法
/**
* 将对象转化为 BigDecimal
*
* @param value 对象值
* @return 对应的 BigDecimal 对象,如果无法转换则返回 null
* @throws ClassCastException 如果无法将 value 转换为 BigDecimal
*/
public static BigDecimal getBigDecimal(Object value) {
if (value == null) {
return null;
} else if (value instanceof BigDecimal) {
return (BigDecimal) value;
} else if (value instanceof String) {
return new BigDecimal((String) value);
} else if (value instanceof BigInteger) {
return new BigDecimal((BigInteger) value);
} else if (value instanceof Number) {
return BigDecimal.valueOf(((Number) value).doubleValue());
} else {
throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass() + " into a BigDecimal.");
}
}
/**
* 两个bigdecimal相加保留两位小数
*
* @param big1
* @param big2
* @return
*/
public static BigDecimal add(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return big1.add(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
/**
* 两个bigdecimal 相减保留两位小数
*
* @param big1
* @param big2
* @return
*/
public static BigDecimal sub(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return big1.subtract(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
/**
* 两个bigdecimal 相乘保留两位小数
*
* @param big1
* @param big2
* @return
*/
public static BigDecimal mul(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return big1.multiply(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
/**
* 两个bigdecimal 相除保留两位小数
*
* @param big1
* @param big2
* @return
*/
public static BigDecimal div(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return big1.divide(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
/**
* 比较两个bigdecimal 是否相等
*
* @param big1
* @param big2
* @return
*/
public static boolean equals(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return 0 == big1.compareTo(big2);
}
/**
* 两个bigdecimal相互比较
*
* 返回的结果是int类型,-1表示小于,0是等于,1是大于。
*/
public static int compare(BigDecimal big1, BigDecimal big2) {
big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);
return big1.compareTo(big2);
}
/**
* 字符串转换 为 BigDecimal ,保留小数位数 2 位
*
* @param str
* @return
*/
public static BigDecimal toBigDecimal2(String str) {
if (StrUtil.isBlank(str)) {
return BigDecimal.ZERO;
}
return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}
/**
* 字符串转换 为 BigDecimal ,保留小数位数 4 位
*
* @param str
* @return
*/
public static BigDecimal toBigDecimal4(String str) {
if (StrUtil.isBlank(str)) {
return BigDecimal.ZERO;
}
return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}
/**
* 字符串转换 为 BigDecimal ,保留小数位数
*
* @param str 字符串
* @param scale 保留小数位数
* @return
*/
public static BigDecimal toBigDecimal(String str, int scale) {
if (StrUtil.isBlank(str)) {
return BigDecimal.ZERO;
}
return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}