1+ package cn .zhangqin56 .common .utils ;
2+
3+ import cn .hutool .core .collection .CollUtil ;
4+ import lombok .experimental .UtilityClass ;
5+
6+ import java .math .BigDecimal ;
7+ import java .math .RoundingMode ;
8+ import java .util .Arrays ;
9+ import java .util .List ;
10+ import java .util .Objects ;
11+ import java .util .Optional ;
12+ import java .util .function .Function ;
13+ import java .util .function .Predicate ;
14+
15+ /**
16+ * BigDecimal 工具类
17+ *
18+ * @author ZhangQin
19+ */
20+ @ UtilityClass
21+ public class BigDecimalUtils {
22+
23+ public final int DEFAULT_DIVIDE_SCALE = 5 ;
24+ public final int DEFAULT_MULTIPLY_SCALE = 2 ;
25+
26+ /**
27+ * 计算传入的BigDecimal数组中所有元素的总和。
28+ *
29+ * @param numbers BigDecimal数组,包含要相加的数字
30+ * @return 返回BigDecimal类型的结果,即所有数字的总和
31+ */
32+ public BigDecimal sum (BigDecimal ... numbers ) {
33+ return sum (Arrays .asList (numbers ));
34+ }
35+
36+
37+ /**
38+ * 计算BigDecimal类型列表中所有非空数字的总和。
39+ *
40+ * @param numbers 包含BigDecimal类型数字的列表
41+ * @return 所有非空数字的总和,以BigDecimal类型表示
42+ */
43+ public BigDecimal sum (List <BigDecimal > numbers ) {
44+ if (CollUtil .isEmpty (numbers )) {
45+ return BigDecimal .ZERO ;
46+ }
47+ return numbers .stream ()
48+ .filter (Objects ::nonNull )
49+ .reduce (BigDecimal .ZERO , BigDecimal ::add );
50+ }
51+
52+
53+ /**
54+ * 对list中对象的某个BigDecimal字段求和
55+ */
56+ public <T > BigDecimal sum (List <T > objsContainsBigDecimal , Function <T , BigDecimal > ref ) {
57+ return objsContainsBigDecimal .stream ()
58+ .filter (Objects ::nonNull )
59+ .map (ref )
60+ .filter (Objects ::nonNull )
61+ .reduce (BigDecimal .ZERO , BigDecimal ::add );
62+ }
63+
64+ /**
65+ * 对list中对象的某个BigDecimal字段求和
66+ */
67+ public <T > BigDecimal sum (List <T > objsContainsBigDecimal , Predicate <T > filter , Function <T , BigDecimal > ref ) {
68+ if (CollUtil .isEmpty (objsContainsBigDecimal )) {
69+ return BigDecimal .ZERO ;
70+ }
71+ return objsContainsBigDecimal .stream ()
72+ .filter (Objects ::nonNull )
73+ .filter (filter )
74+ .map (ref )
75+ .filter (Objects ::nonNull )
76+ .reduce (BigDecimal .ZERO , BigDecimal ::add );
77+ }
78+
79+ /**
80+ * 大于
81+ */
82+ public boolean gt (BigDecimal v1 , BigDecimal v2 ) {
83+ return v1 .compareTo (v2 ) > 0 ;
84+ }
85+
86+ /**
87+ * 大于0
88+ */
89+ public boolean gt0 (BigDecimal v ) {
90+ return gt (v , BigDecimal .ZERO );
91+ }
92+
93+ /**
94+ * 大于等于
95+ */
96+ public boolean ge (BigDecimal v1 , BigDecimal v2 ) {
97+ return v1 .compareTo (v2 ) >= 0 ;
98+ }
99+
100+ /**
101+ * 大于等于0
102+ */
103+ public boolean ge0 (BigDecimal v ) {
104+ return ge (v , BigDecimal .ZERO );
105+ }
106+
107+ /**
108+ * 小于
109+ */
110+ public boolean lt (BigDecimal v1 , BigDecimal v2 ) {
111+ return v1 .compareTo (v2 ) < 0 ;
112+ }
113+
114+ /**
115+ * 小于0
116+ */
117+ public boolean lt0 (BigDecimal v ) {
118+ return lt (v , BigDecimal .ZERO );
119+ }
120+
121+ /**
122+ * 小于等于
123+ */
124+ public boolean le (BigDecimal v1 , BigDecimal v2 ) {
125+ return v1 .compareTo (v2 ) <= 0 ;
126+ }
127+
128+ /**
129+ * 小于等于0
130+ */
131+ public boolean le0 (BigDecimal v ) {
132+ return le (v , BigDecimal .ZERO );
133+ }
134+
135+ /**
136+ * 不等于
137+ */
138+ public boolean ne (BigDecimal v1 , BigDecimal v2 ) {
139+ return v1 .compareTo (v2 ) != 0 ;
140+ }
141+
142+ /**
143+ * 不等于0
144+ */
145+ public boolean ne0 (BigDecimal v ) {
146+ return ne (v , BigDecimal .ZERO );
147+ }
148+
149+ /**
150+ * 等于
151+ */
152+ public boolean eq (BigDecimal v1 , BigDecimal v2 ) {
153+ return v1 .compareTo (v2 ) == 0 ;
154+ }
155+
156+ /**
157+ * 等于0
158+ */
159+ public boolean eq0 (BigDecimal v ) {
160+ return eq (v , BigDecimal .ZERO );
161+ }
162+
163+
164+ /**
165+ * 封装BigDecimal对象
166+ *
167+ * @param value 要封装的BigDecimal对象
168+ * @return 如果value为null,则返回BigDecimal.ZERO;否则返回value
169+ */
170+ public BigDecimal wrapBigDecimal (BigDecimal value ) {
171+ return Optional .ofNullable (value ).orElse (BigDecimal .ZERO );
172+ }
173+
174+ /**
175+ * 返回入参的负数值,负数仍是负数
176+ */
177+ public BigDecimal negate (BigDecimal value ) {
178+ return wrapBigDecimal (value ).abs ().negate ();
179+ }
180+
181+ public BigDecimal cal (BigDecimal v1 , BigDecimal v2 , CalculateType type ) {
182+ return switch (type ) {
183+ case ADD -> wrapBigDecimal (v1 ).add (wrapBigDecimal (v2 ));
184+ case SUBTRACT -> wrapBigDecimal (v1 ).subtract (wrapBigDecimal (v2 ));
185+ case MULTIPLY , MULTIPLY_CEILING ->
186+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_DIVIDE_SCALE , RoundingMode .CEILING );
187+ case MULTIPLY_UP ->
188+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .UP );
189+ case MULTIPLY_DOWN ->
190+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .DOWN );
191+ case MULTIPLY_FLOOR ->
192+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .FLOOR );
193+ case MULTIPLY_HALF_UP ->
194+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .HALF_UP );
195+ case MULTIPLY_HALF_DOWN ->
196+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .HALF_DOWN );
197+ case MULTIPLY_HALF_EVEN ->
198+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .HALF_EVEN );
199+ case MULTIPLY_UNNECESSARY ->
200+ wrapBigDecimal (v1 ).multiply (wrapBigDecimal (v2 )).setScale (DEFAULT_MULTIPLY_SCALE , RoundingMode .UNNECESSARY );
201+ case DIVIDE_UP -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .UP );
202+ case DIVIDE_DOWN -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .DOWN );
203+ case DIVIDE_CEILING -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .CEILING );
204+ case DIVIDE_FLOOR -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .FLOOR );
205+ case DIVIDE_HALF_UP -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .HALF_UP );
206+ case DIVIDE_HALF_DOWN -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .HALF_DOWN );
207+ case DIVIDE_HALF_EVEN -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .HALF_EVEN );
208+ case DIVIDE_UNNECESSARY -> wrapBigDecimal (v1 ).divide (v2 , DEFAULT_DIVIDE_SCALE , RoundingMode .UNNECESSARY );
209+ };
210+ }
211+
212+ public enum CalculateType {
213+ ADD ,
214+ SUBTRACT ,
215+ MULTIPLY ,
216+ MULTIPLY_UP ,
217+ MULTIPLY_DOWN ,
218+ MULTIPLY_CEILING ,
219+ MULTIPLY_FLOOR ,
220+ MULTIPLY_HALF_UP ,
221+ MULTIPLY_HALF_DOWN ,
222+ MULTIPLY_HALF_EVEN ,
223+ MULTIPLY_UNNECESSARY ,
224+ DIVIDE_UP ,
225+ DIVIDE_DOWN ,
226+ DIVIDE_CEILING ,
227+ DIVIDE_FLOOR ,
228+ DIVIDE_HALF_UP ,
229+ DIVIDE_HALF_DOWN ,
230+ DIVIDE_HALF_EVEN ,
231+ DIVIDE_UNNECESSARY ,
232+ }
233+ }
0 commit comments