工具类篇大全
前言
BigDecimal作为Java中常用的金额计算类,由于金额计算涉及小数点甚至四舍五入计数法等。其他数据类型如:Double、Float、Integer、Long等都不能作为一个企业的标准金额计算工具。经常有人用除BigDecimal以外的其他类型计算金额,导致计算结果有误,要么少了小数点,要么多了小数点,要么报错等等。因此,作为一名合格的程序员,强调用BigDecimal作为基本金额计算类显得尤为重要。
一、BigDecimal、Double、String互转
入参为Double,返回小数点后指定位数的数值
public static Double setScaleUp(Double value, int scale) {
BigDecimal bd = BigDecimal.valueOf(value.doubleValue());
return Double.valueOf(bd.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue());
}
获取指定小数点位数的值,并四舍五入
/** 截取小数点位
* @author
* @DateTime 2018年10月16日 上午9:58:52
*
* @param value
* @param scale
* @return
*/
public static BigDecimal setScaleByBigDecimalDown(BigDecimal value, int scale) {
return value.setScale(scale, BigDecimal.ROUND_DOWN);
}
Double转Bigdecimal
public static BigDecimal convertDoubleToBigdecimal(Double d1) {
return BigDecimal.valueOf(d1 == null ? 0 : d1);
}
BigDecimal转Double
/**
* 转换BigDecimal 到double
* @author
* @DateTime 2017年11月11日 上午10:14:44
*
* @param bigDecimal
* @return
*/
public static Double convertBigDecimalToDouble(BigDecimal bigDecimal) {
return bigDecimal == null ? null : bigDecimal.doubleValue();
}
String转BigDecimal
public static BigDecimal converStringToBigdecimal(String st, int scale) {
if (StringUtils.isEmpty(st)) {
return BigDecimal.ZERO;
} else {
return FcsNumberUtils.setScaleOfBigDecimal(new BigDecimal(st), scale);
}
}
BigDecimal转String
public static String bigdecimalToString(BigDecimal b1) {
if (b1 == null) {
return "0";
} else {
return b1.toString();
}
}
Double转String
public static String doubleToString(Double b1) {
if (b1 == null) {
return "0";
} else {
return b1.toString();
}
}
BigDecimal转Long
public static Long convertBigDecimalToLong(BigDecimal bigDecimal) {
return bigDecimal == null ? null : bigDecimal.longValue();
}
二、常用计算方法
BigDecimal比较大小
/**
* @author
* @DateTime 2018年1月16日 上午10:37:55
*
* @param b1
* @param b2
* @return
*/
public static boolean compareToOnBigDecimal(BigDecimal b1, BigDecimal b2) {
if (b1 == null) {
b1 = BigDecimal.ZERO;
}
if (b2 == null) {
b2 = BigDecimal.ZERO;
}
if (b1.compareTo(b2) == 0) {
return true;
} else {
return false;
}
}
BigDecimal加法计算
public static BigDecimal addOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
if (d1 == null) {
d1 = BigDecimal.ZERO;
}
if (d2 == null) {
d2 = BigDecimal.ZERO;
}
return FcsNumberUtils.addOfBigDecimal(d1, d2, scale);
}
BigDecimal减法计算
/**
* @author
* @DateTime 2018年3月23日 下午5:30:06
*
* @param d1
* @param d2
* @param scale
* @return
*/
public static BigDecimal subtractOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
if (d1 == null) {
d1 = BigDecimal.ZERO;
}
if (d2 == null) {
d2 = BigDecimal.ZERO;
}
if (scale <= 0) {
scale = 2;
}
BigDecimal bd = d1.subtract(d2);
return bd.setScale(scale, BigDecimal.ROUND_HALF_UP);
}
BigDecimal乘法计算
public static BigDecimal multiplyOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
return multiplyOfBigDecimal(d1, d2).setScale(scale, 4);
}
public static BigDecimal multiplyOfBigDecimal(BigDecimal d1, BigDecimal d2) {
return d1.multiply(d2);
}
BigDecimal除法计算
public static BigDecimal divideOfBigDecimal(BigDecimal d1, BigDecimal d2, int scale) {
return divideOfBigDecimal(d1, d2).setScale(scale, 4);
}
public static BigDecimal divideOfBigDecimal(BigDecimal d1, BigDecimal d2) {
return d1.divide(d2, 16, 4);
}
Double加法计算
public static Double addOfDouble(Double d1, Double d2, int scale) {
if (d1 == null) {
d1 = 0.00D;
}
if (d2 == null) {
d2 = 0.00D;
}
Double result = FcsNumberUtils.add(d1, d2, scale);
return (result.doubleValue() == 0.00) ? null : result;
}
Double是否相等判断
/**
* @author
* @DateTime 2017年8月24日 下午1:48:52
*
* @param d1
* @param d2
* @return
*/
public static boolean doubleIsEquals(Double d1, Double d2) {
if (d1 == null) {
d1 = 0.00d;
}
if (d2 == null) {
d2 = 0.00d;
}
BigDecimal dd1 = BigDecimal.valueOf(setScaleUp(d1, 2));
BigDecimal dd2 = BigDecimal.valueOf(setScaleUp(d2, 2));
int retval = dd1.compareTo(dd2);
if (retval == 0) {
return true;
} else {
return false;
}
}
Double减法计算
/**
* @author
* @DateTime 2018年3月23日 下午5:30:06
*
* @param d1
* @param d2
* @param scale
* @return
*/
public static Double subtractOfBigDouble(Double d1, Double d2, int scale) {
if (d1 == null) {
d1 = new Double(0);
}
if (d2 == null) {
d2 = new Double(0);
}
if (scale <= 0) {
scale = 2;
}
return FcsNumberUtils.subtract(d1, d2, scale);
}
Double乘法计算
public static Double multiply(Double d1, Double d2, int scale) {
return BigDecimal.valueOf(multiply(d1, d2)).setScale(scale, 4).doubleValue();
}
Double除法计算
public static Double divide(Double d1, Double d2, int scale) {
return BigDecimal.valueOf(divide(d1, d2)).setScale(scale, 4).doubleValue();
}
BigDecimal绝对值
public static BigDecimal negateByBigDecimal(BigDecimal bigdecimal) {
if (bigdecimal == null) {
return null;
}
return bigdecimal.negate();
}
三、总结
在开发中,一个项目总会需要涉及到计算,如金额的计算、数字的计算、计数等。一旦涉及到计算就会少不了要使用以上类和工具。整理和定义一个工具类,将为编码工作省下极大的便利。工欲善其事必先利其器。
既然都看完了整篇文章,相信对你一定有所帮助。原创不易,勿做伸手党。
点击下方【打赏】小编,或者关注公众号给予支持,你们的每一份鼓励都将是小编伟大的动力。
![](https://i-blog.csdnimg.cn/blog_migrate/c6588a897387ffefcdda1428dcd8e7dd.jpeg)