123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- package net.lab1024.smartadmin.util;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.text.NumberFormat;
- /**
- * 全局 BigDecimal 工具类
- *
- * @author listen
- * @date 2018/01/17 13:54
- */
- public class SmartBigDecimalUtil {
- /**
- * 价格类型 保留小数点 2
- */
- public static final int PRICE_DECIMAL_POINT = 2;
- /**
- * 价格类型 保留小数点 6
- */
- public static final int SIX_PRICE_DECIMAL_POINT = 6;
- /**
- * 重量类型保留小数点 3
- */
- public static final int WEIGHT_DECIMAL_POINT = 3;
- /**
- * 金额相关计算方法:四舍五入 保留2位小数点
- */
- public static class Amount {
- public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.add(num2), PRICE_DECIMAL_POINT);
- }
- public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.multiply(num2), PRICE_DECIMAL_POINT);
- }
- public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.subtract(num2), PRICE_DECIMAL_POINT);
- }
- public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.divide(num2, RoundingMode.HALF_UP), PRICE_DECIMAL_POINT);
- }
- }
- /**
- * 金额相关计算方法:四舍五入 保留2位小数点
- */
- public static class AmountSix {
- public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.add(num2), SIX_PRICE_DECIMAL_POINT);
- }
- public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.multiply(num2), SIX_PRICE_DECIMAL_POINT);
- }
- public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.subtract(num2), SIX_PRICE_DECIMAL_POINT);
- }
- public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
- return num1.divide(num2, PRICE_DECIMAL_POINT, RoundingMode.HALF_UP);
- }
- }
- /**
- * 重量相关计算方法:四舍五入 保留3位小数点
- */
- public static class Weight {
- public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.add(num2), WEIGHT_DECIMAL_POINT);
- }
- public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.multiply(num2), WEIGHT_DECIMAL_POINT);
- }
- public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
- return setScale(num1.subtract(num2), WEIGHT_DECIMAL_POINT);
- }
- public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
- return num1.divide(num2, WEIGHT_DECIMAL_POINT, RoundingMode.HALF_UP);
- }
- }
- /**
- * BigDecimal 加法 num1 + num2
- * 未做非空校验
- *
- * @param num1
- * @param num2
- * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
- * @return BigDecimal
- */
- public static BigDecimal add(BigDecimal num1, BigDecimal num2, int point) {
- return setScale(num1.add(num2), point);
- }
- /**
- * BigDecimal 乘法 num1 x num2
- * 未做非空校验
- *
- * @param num1
- * @param num2
- * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
- * @return BigDecimal
- */
- public static BigDecimal multiply(BigDecimal num1, BigDecimal num2, int point) {
- return setScale(num1.multiply(num2), point);
- }
- /**
- * BigDecimal 减法 num1 - num2
- * 未做非空校验
- *
- * @param num1
- * @param num2
- * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
- * @return BigDecimal
- */
- public static BigDecimal subtract(BigDecimal num1, BigDecimal num2, int point) {
- return setScale(num1.subtract(num2), point);
- }
- /**
- * BigDecimal 除法 num1/num2
- * 未做非空校验
- *
- * @param num1
- * @param num2
- * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
- * @return BigDecimal
- */
- public static BigDecimal divide(BigDecimal num1, BigDecimal num2, int point) {
- return num1.divide(num2, point, RoundingMode.HALF_UP);
- }
- /**
- * 设置小数点类型为 四舍五入
- *
- * @param num
- * @param point
- * @return BigDecimal
- */
- public static BigDecimal setScale(BigDecimal num, int point) {
- return num.setScale(point, RoundingMode.HALF_UP);
- }
- /**
- * 比较 num1 是否大于 num2
- *
- * @param num1
- * @param num2
- * @return boolean
- */
- public static boolean isGreaterThan(BigDecimal num1, BigDecimal num2) {
- return num1.compareTo(num2) == 1;
- }
- /**
- * 比较 num1 是否大于等于 num2
- *
- * @param num1
- * @param num2
- * @return boolean
- */
- public static boolean isGreaterOrEqual(BigDecimal num1, BigDecimal num2) {
- return isGreaterThan(num1, num2) || equals(num1, num2);
- }
- /**
- * 比较 num1 是否小于 num2
- *
- * @param num1
- * @param num2
- * @return boolean
- */
- public static boolean isLessThan(BigDecimal num1, BigDecimal num2) {
- return num1.compareTo(num2) == - 1;
- }
- /**
- * 比较 num1 是否小于等于 num2
- *
- * @param num1
- * @param num2
- * @return boolean
- */
- public static boolean isLessOrEqual(BigDecimal num1, BigDecimal num2) {
- return isLessThan(num1, num2) || equals(num1, num2);
- }
- /**
- * 比较 num1 是否等于 num2
- *
- * @param num1
- * @param num2
- * @return
- */
- public static boolean equals(BigDecimal num1, BigDecimal num2) {
- return num1.compareTo(num2) == 0;
- }
- /**
- * 计算 num1 / num2 的百分比
- *
- * @param num1
- * @param num2
- * @return String
- */
- public static String getPercentage(BigDecimal num1, BigDecimal num2) {
- BigDecimal result = num1.divide(num2, 4, RoundingMode.HALF_UP);
- NumberFormat percent = NumberFormat.getPercentInstance();
- percent.setMaximumFractionDigits(2);
- return percent.format(result.doubleValue());
- }
- /**
- * 计算 num1 / num2 的百分比
- *
- * @param num1
- * @param num2
- * @param point 保留几位小数
- * @return String
- */
- public static BigDecimal bigDecimalPercent(Integer num1, Integer num2, int point) {
- if (num1 == null || num2 == null) {
- return BigDecimal.ZERO;
- }
- if (num2.equals(Integer.valueOf(0))) {
- return BigDecimal.ZERO;
- }
- BigDecimal bigDecimalNum1 = new BigDecimal(num1);
- BigDecimal bigDecimalNum2 = new BigDecimal(num2);
- return bigDecimalPercent(bigDecimalNum1, bigDecimalNum2, point);
- }
- /**
- * 计算 num1 / num2 的百分比
- *
- * @param num1
- * @param num2
- * @param point 保留几位小数
- * @return String
- */
- public static BigDecimal bigDecimalPercent(BigDecimal num1, BigDecimal num2, int point) {
- if (num1 == null || num2 == null) {
- return BigDecimal.ZERO;
- }
- if (equals(BigDecimal.ZERO, num2)) {
- return BigDecimal.ZERO;
- }
- BigDecimal percent = num1.divide(num2, point + 2, RoundingMode.HALF_UP);
- BigDecimal percent100 = percent.multiply(new BigDecimal(100)).setScale(point);
- return percent100;
- }
- /**
- * 判断num是否为空 或者 零
- *
- * @param num
- * @return String
- */
- public static Boolean isEmpty(BigDecimal num) {
- return null == num || equals(BigDecimal.ZERO, num);
- }
- /**
- * 判断num是否 不等于null 并且不等于零
- *
- * @param num
- * @return String
- */
- public static Boolean isNotEmpty(BigDecimal num) {
- return ! isEmpty(num);
- }
- /**
- * 转换为万
- *
- * @param num
- * @param point
- * @return
- */
- public static BigDecimal convertTenThousand(BigDecimal num, int point) {
- BigDecimal decimal = num.divide(new BigDecimal(10000), point, RoundingMode.HALF_UP);
- return decimal;
- }
- /**
- * 转换为负数
- *
- * @param num
- * @return
- */
- public static BigDecimal convertToMinusNumber(BigDecimal num) {
- if (isLessOrEqual(num, BigDecimal.ZERO)) {
- return num;
- }
- return BigDecimal.ZERO.subtract(num);
- }
- }
|