dengzedong
2024-12-24 aa0382e44311f9f7e62a688c8fcaa9c69a512e0f
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.common.util.number;
H 2
3 import cn.hutool.core.math.Money;
4 import cn.hutool.core.util.NumberUtil;
5
6 import java.math.BigDecimal;
7 import java.math.RoundingMode;
8
9 /**
10  * 金额工具类
11  *
12  * @author iailab
13  */
14 public class MoneyUtils {
15
16     /**
17      * 金额的小数位数
18      */
19     private static final int PRICE_SCALE = 2;
20
21     /**
22      * 百分比对应的 BigDecimal 对象
23      */
24     public static final BigDecimal PERCENT_100 = BigDecimal.valueOf(100);
25
26     /**
27      * 计算百分比金额,四舍五入
28      *
29      * @param price 金额
30      * @param rate  百分比,例如说 56.77% 则传入 56.77
31      * @return 百分比金额
32      */
33     public static Integer calculateRatePrice(Integer price, Double rate) {
34         return calculateRatePrice(price, rate, 0, RoundingMode.HALF_UP).intValue();
35     }
36
37     /**
38      * 计算百分比金额,向下传入
39      *
40      * @param price 金额
41      * @param rate  百分比,例如说 56.77% 则传入 56.77
42      * @return 百分比金额
43      */
44     public static Integer calculateRatePriceFloor(Integer price, Double rate) {
45         return calculateRatePrice(price, rate, 0, RoundingMode.FLOOR).intValue();
46     }
47
48     /**
49      * 计算百分比金额
50      *
51      * @param price   金额(单位分)
52      * @param count   数量
53      * @param percent 折扣(单位分),列如 60.2%,则传入 6020
54      * @return 商品总价
55      */
56     public static Integer calculator(Integer price, Integer count, Integer percent) {
57         price = price * count;
58         if (percent == null) {
59             return price;
60         }
61         return MoneyUtils.calculateRatePriceFloor(price, (double) (percent / 100));
62     }
63
64     /**
65      * 计算百分比金额
66      *
67      * @param price        金额
68      * @param rate         百分比,例如说 56.77% 则传入 56.77
69      * @param scale        保留小数位数
70      * @param roundingMode 舍入模式
71      */
72     public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) {
73         return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以
74                 .divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以 100
75     }
76
77     /**
78      * 分转元
79      *
80      * @param fen 分
81      * @return 元
82      */
83     public static BigDecimal fenToYuan(int fen) {
84         return new Money(0, fen).getAmount();
85     }
86
87     /**
88      * 分转元(字符串)
89      *
90      * 例如说 fen 为 1 时,则结果为 0.01
91      *
92      * @param fen 分
93      * @return 元
94      */
95     public static String fenToYuanStr(int fen) {
96         return new Money(0, fen).toString();
97     }
98
99     /**
100      * 金额相乘,默认进行四舍五入
101      *
102      * 位数:{@link #PRICE_SCALE}
103      *
104      * @param price 金额
105      * @param count 数量
106      * @return 金额相乘结果
107      */
108     public static BigDecimal priceMultiply(BigDecimal price, BigDecimal count) {
109         if (price == null || count == null) {
110             return null;
111         }
112         return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP);
113     }
114
115     /**
116      * 金额相乘(百分比),默认进行四舍五入
117      *
118      * 位数:{@link #PRICE_SCALE}
119      *
120      * @param price  金额
121      * @param percent 百分比
122      * @return 金额相乘结果
123      */
124     public static BigDecimal priceMultiplyPercent(BigDecimal price, BigDecimal percent) {
125         if (price == null || percent == null) {
126             return null;
127         }
128         return price.multiply(percent).divide(PERCENT_100, PRICE_SCALE, RoundingMode.HALF_UP);
129     }
130
131 }