Java 中BigDecimal ⼯具类(⽀持空值运算版)
前⾔
需要计算的场景绕不过去会使⽤BigDecimal类,可频繁的判空让代码可读性下降也使代码冗余度增⾼,不判空⼜容易报空指针异常,⽽且有些场景下的计算,结果为空时需要返回null ,所以也不可以将将BigDecimal类型的值都初始化为0,会让运算结果产⽣歧义。为解决上述痛点,于是整理了⼀个⼯具类供所有项⽬⼀起使⽤。
⼀.⼯具类⽀持功能
1. 加减乘除、累加、倍数运算。
2. Integer 、Long 、Float 、Double 、String 、Object 转为BigDecimal 。
3. 除法四舍五⼊并默认保留20位⼩数点。
4. BigDecimal 转为String 字符串,并禁⽌⽤科学计数法显⽰结果。
5. ⼩数点位数保留。
6. 多种数据类型间混合运算(如Double和Long转为BigDecimal运算)
7. 以上所有计算,⽀持所有⼊参为空时运算
⼆.⼯具类源码复制到类⽂件DecimalUtils .java 中,可直接使⽤。import java.math.BigDecimal;/** * @author ⼤脑补丁 * @description: BigDecimal 运算⼯具类 * @create 2020-10-10 14:14 */public class DecimalUtils { /**  * 加法计算(result = x + y )  *  * @param x 被加数(可为null )  * @param y 加数 (可为null )  * @return 和 (可为null )  * @author ⼤脑补丁 on 2020-03-30 14:52  */ public static BigDecimal add(BigDecimal x, BigDecimal y) {  if (x == null) {  return y;  }  if (y == null) {  return x;  }  return x.add(y); } /**  * 加法计算(result = a + b + c + d )  *  * @param a 被加数(可为null )  * @param b 加数(可为null )  * @param c 加数(可为null )  * @param d 加数(可为null )  * @return BigDecimal (可为null )  * @author ⼤脑补丁 on 2020-03-30 22:17  */ public static BigDecimal add(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d) {
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static BigDecimal add(BigDecimal a, BigDecimal b, BigDecimal c, BigDecimal d) {  BigDecimal ab = add(a, b);  BigDecimal cd = add(c, d);  return add(ab, cd); } /**  * 累加计算(result=x + result)  *  * @param x      被加数(可为null )  * @param result 和 (可为null,若被加数不为为null ,result 默认值为0)  * @return result 和 (可为null )  * @author ⼤脑补丁 on 2020-03-30 14:16  */ public static BigDecimal accumulate(BigDecimal x, BigDecimal result) {  if (x == null) {  return result;  }  if (result == null) {  result = new BigDecimal("0");  }  return result.add(x); } /**  * 减法计算(result = x - y)  *  * @param x 被减数(可为null )  * @param y 减数(可为null )  * @return BigDecimal 差 (可为null )  * @author ⼤脑补丁 on 2020-03-30 14:47  */ public static BigDecimal subtract(BigDecimal x, BigDecimal y) {  if (x == null || y == null) {  return null;  }  return x.subtract(y); } /**  * 乘法计算(result = x × y)  *  * @param x 乘数(可为null)  * @param y 乘数(可为null)  * @return BigDecimal 积  * @author ⼤脑补丁 on 2020-03-30 14:14  */ public static BigDecimal multiply(BigDecimal x, BigDecimal y) {  if (x == null || y == null) {  return null;  }  return x.multiply(y); } /**  * 除法计算(result = x ÷ y)  *  * @param x 被除数(可为null )  * @param y 除数(可为null )  * @return 商 (可为null,四舍五⼊,默认保留20位⼩数)  * @author ⼤脑补丁 on 2020-03-30 14:15  */ public static BigDecimal divide(Bi
gDecimal x, BigDecimal y) {  if (x == null || y == null || ypareTo(BigDecimal.ZERO) == 0) {  return null;  }
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
}  // 结果为0.000..时,不⽤科学计数法展⽰  return stripTrailingZeros(x.divide(y, 20, BigDecimal.ROUND_HALF_UP)); } /**  * 转为字符串(防⽌返回可续计数法表达式)  *  * @param x 要转字符串的⼩数  * @return String  * @author ⼤脑补丁 on 2020-03-30 15:08  */ public static String toPlainString(BigDecimal x) {  if (x == null) {  return null;  }  PlainString(); } /**  * 保留⼩数位数  *  * @param x    ⽬标⼩数  * @param scale 要保留⼩数位数  * @return BigDecimal 结果四舍五⼊  * @author ⼤脑补丁 on 2020-03-30 15:17  */ public static BigDecimal scale(BigDecimal x, int scale) {  if (x == null) {  return null;  }  return x.setScale(scale, BigDecimal.ROUND_HALF_UP); } /**  * 整型转为BigDecimal  *  * @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDecimal(Integer x) {  if (x == null) {  return null;  }  return new String()); } /**  * 长整型转为BigDecimal  *  * @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDecimal(Long x) {  if (x == null) {  return null;  }  return new String()); } /**  * 双精度型转为BigDecimal  *  * @param x(可为null)103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
* @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDecimal(Double x) {  if (x == null) {  return null;  }  return new String()); } /**  * 单精度型转为BigDecimal  *  * @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDe
cimal(Float x) {  if (x == null) {  return null;  }  return new String()); } /**  * 字符串型转为BigDecimal  *  * @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDecimal(String x) {  if (x == null || x.equals("")) {  return null;  }  return new BigDecimal(x); } /**  * 对象类型转为BigDecimal  *  * @param x(可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:24  */ public static BigDecimal toBigDecimal(Object x) {  if (x == null) {  return null;  }  BigDecimal result = null;  try {  result = String());  } catch (Exception e) {  e.printStackTrace();  }  return result; } /**  * 倍数计算,⽤于单位换算  *  * @param x        ⽬标数(可为null)  * @param multiple 倍数 (可为null)  * @return BigDecimal (可为null)  * @author ⼤脑补丁 on 2020-03-30 22:43
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
三.如何使⽤
使⽤BigDecimal计算的时候,再也不⽤考虑判空、初始化数值了。代码简洁清爽了许多。  * @author ⼤脑补丁 on 2020-03-30 22:43  */ public static BigDecimal multiple(BigDecimal x, Integer multiple) {  if (x == null || multiple == null) {  return null;  }  return DecimalUtils.multiply(x, toBigDecimal(multiple)); } /**  * 去除⼩数点后的0(如: 输⼊1.000返回1)  *  * @param x ⽬标数(可为null)  * @return  */ public static BigDecimal stripTrailingZeros(BigDecimal x) {  if (x == null) {  return null;  }  return x.stripTrailingZeros(); }}
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249bigdecimal除法保留小数
250
251
252
253
254

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。