SmartBigDecimalUtil.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. package net.lab1024.smartadmin.util;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. import java.text.NumberFormat;
  5. /**
  6. * 全局 BigDecimal 工具类
  7. *
  8. * @author listen
  9. * @date 2018/01/17 13:54
  10. */
  11. public class SmartBigDecimalUtil {
  12. /**
  13. * 价格类型 保留小数点 2
  14. */
  15. public static final int PRICE_DECIMAL_POINT = 2;
  16. /**
  17. * 价格类型 保留小数点 6
  18. */
  19. public static final int SIX_PRICE_DECIMAL_POINT = 6;
  20. /**
  21. * 重量类型保留小数点 3
  22. */
  23. public static final int WEIGHT_DECIMAL_POINT = 3;
  24. /**
  25. * 金额相关计算方法:四舍五入 保留2位小数点
  26. */
  27. public static class Amount {
  28. public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
  29. return setScale(num1.add(num2), PRICE_DECIMAL_POINT);
  30. }
  31. public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
  32. return setScale(num1.multiply(num2), PRICE_DECIMAL_POINT);
  33. }
  34. public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
  35. return setScale(num1.subtract(num2), PRICE_DECIMAL_POINT);
  36. }
  37. public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
  38. return setScale(num1.divide(num2, RoundingMode.HALF_UP), PRICE_DECIMAL_POINT);
  39. }
  40. }
  41. /**
  42. * 金额相关计算方法:四舍五入 保留2位小数点
  43. */
  44. public static class AmountSix {
  45. public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
  46. return setScale(num1.add(num2), SIX_PRICE_DECIMAL_POINT);
  47. }
  48. public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
  49. return setScale(num1.multiply(num2), SIX_PRICE_DECIMAL_POINT);
  50. }
  51. public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
  52. return setScale(num1.subtract(num2), SIX_PRICE_DECIMAL_POINT);
  53. }
  54. public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
  55. return num1.divide(num2, PRICE_DECIMAL_POINT, RoundingMode.HALF_UP);
  56. }
  57. }
  58. /**
  59. * 重量相关计算方法:四舍五入 保留3位小数点
  60. */
  61. public static class Weight {
  62. public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
  63. return setScale(num1.add(num2), WEIGHT_DECIMAL_POINT);
  64. }
  65. public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
  66. return setScale(num1.multiply(num2), WEIGHT_DECIMAL_POINT);
  67. }
  68. public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
  69. return setScale(num1.subtract(num2), WEIGHT_DECIMAL_POINT);
  70. }
  71. public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
  72. return num1.divide(num2, WEIGHT_DECIMAL_POINT, RoundingMode.HALF_UP);
  73. }
  74. }
  75. /**
  76. * BigDecimal 加法 num1 + num2
  77. * 未做非空校验
  78. *
  79. * @param num1
  80. * @param num2
  81. * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
  82. * @return BigDecimal
  83. */
  84. public static BigDecimal add(BigDecimal num1, BigDecimal num2, int point) {
  85. return setScale(num1.add(num2), point);
  86. }
  87. /**
  88. * BigDecimal 乘法 num1 x num2
  89. * 未做非空校验
  90. *
  91. * @param num1
  92. * @param num2
  93. * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
  94. * @return BigDecimal
  95. */
  96. public static BigDecimal multiply(BigDecimal num1, BigDecimal num2, int point) {
  97. return setScale(num1.multiply(num2), point);
  98. }
  99. /**
  100. * BigDecimal 减法 num1 - num2
  101. * 未做非空校验
  102. *
  103. * @param num1
  104. * @param num2
  105. * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
  106. * @return BigDecimal
  107. */
  108. public static BigDecimal subtract(BigDecimal num1, BigDecimal num2, int point) {
  109. return setScale(num1.subtract(num2), point);
  110. }
  111. /**
  112. * BigDecimal 除法 num1/num2
  113. * 未做非空校验
  114. *
  115. * @param num1
  116. * @param num2
  117. * @param point 请使用BigDecimalUtils.PRICE_DECIMAL_POINT | BigDecimalUtils.WEIGHT_DECIMAL_POINT
  118. * @return BigDecimal
  119. */
  120. public static BigDecimal divide(BigDecimal num1, BigDecimal num2, int point) {
  121. return num1.divide(num2, point, RoundingMode.HALF_UP);
  122. }
  123. /**
  124. * 设置小数点类型为 四舍五入
  125. *
  126. * @param num
  127. * @param point
  128. * @return BigDecimal
  129. */
  130. public static BigDecimal setScale(BigDecimal num, int point) {
  131. return num.setScale(point, RoundingMode.HALF_UP);
  132. }
  133. /**
  134. * 比较 num1 是否大于 num2
  135. *
  136. * @param num1
  137. * @param num2
  138. * @return boolean
  139. */
  140. public static boolean isGreaterThan(BigDecimal num1, BigDecimal num2) {
  141. return num1.compareTo(num2) == 1;
  142. }
  143. /**
  144. * 比较 num1 是否大于等于 num2
  145. *
  146. * @param num1
  147. * @param num2
  148. * @return boolean
  149. */
  150. public static boolean isGreaterOrEqual(BigDecimal num1, BigDecimal num2) {
  151. return isGreaterThan(num1, num2) || equals(num1, num2);
  152. }
  153. /**
  154. * 比较 num1 是否小于 num2
  155. *
  156. * @param num1
  157. * @param num2
  158. * @return boolean
  159. */
  160. public static boolean isLessThan(BigDecimal num1, BigDecimal num2) {
  161. return num1.compareTo(num2) == - 1;
  162. }
  163. /**
  164. * 比较 num1 是否小于等于 num2
  165. *
  166. * @param num1
  167. * @param num2
  168. * @return boolean
  169. */
  170. public static boolean isLessOrEqual(BigDecimal num1, BigDecimal num2) {
  171. return isLessThan(num1, num2) || equals(num1, num2);
  172. }
  173. /**
  174. * 比较 num1 是否等于 num2
  175. *
  176. * @param num1
  177. * @param num2
  178. * @return
  179. */
  180. public static boolean equals(BigDecimal num1, BigDecimal num2) {
  181. return num1.compareTo(num2) == 0;
  182. }
  183. /**
  184. * 计算 num1 / num2 的百分比
  185. *
  186. * @param num1
  187. * @param num2
  188. * @return String
  189. */
  190. public static String getPercentage(BigDecimal num1, BigDecimal num2) {
  191. BigDecimal result = num1.divide(num2, 4, RoundingMode.HALF_UP);
  192. NumberFormat percent = NumberFormat.getPercentInstance();
  193. percent.setMaximumFractionDigits(2);
  194. return percent.format(result.doubleValue());
  195. }
  196. /**
  197. * 计算 num1 / num2 的百分比
  198. *
  199. * @param num1
  200. * @param num2
  201. * @param point 保留几位小数
  202. * @return String
  203. */
  204. public static BigDecimal bigDecimalPercent(Integer num1, Integer num2, int point) {
  205. if (num1 == null || num2 == null) {
  206. return BigDecimal.ZERO;
  207. }
  208. if (num2.equals(Integer.valueOf(0))) {
  209. return BigDecimal.ZERO;
  210. }
  211. BigDecimal bigDecimalNum1 = new BigDecimal(num1);
  212. BigDecimal bigDecimalNum2 = new BigDecimal(num2);
  213. return bigDecimalPercent(bigDecimalNum1, bigDecimalNum2, point);
  214. }
  215. /**
  216. * 计算 num1 / num2 的百分比
  217. *
  218. * @param num1
  219. * @param num2
  220. * @param point 保留几位小数
  221. * @return String
  222. */
  223. public static BigDecimal bigDecimalPercent(BigDecimal num1, BigDecimal num2, int point) {
  224. if (num1 == null || num2 == null) {
  225. return BigDecimal.ZERO;
  226. }
  227. if (equals(BigDecimal.ZERO, num2)) {
  228. return BigDecimal.ZERO;
  229. }
  230. BigDecimal percent = num1.divide(num2, point + 2, RoundingMode.HALF_UP);
  231. BigDecimal percent100 = percent.multiply(new BigDecimal(100)).setScale(point);
  232. return percent100;
  233. }
  234. /**
  235. * 判断num是否为空 或者 零
  236. *
  237. * @param num
  238. * @return String
  239. */
  240. public static Boolean isEmpty(BigDecimal num) {
  241. return null == num || equals(BigDecimal.ZERO, num);
  242. }
  243. /**
  244. * 判断num是否 不等于null 并且不等于零
  245. *
  246. * @param num
  247. * @return String
  248. */
  249. public static Boolean isNotEmpty(BigDecimal num) {
  250. return ! isEmpty(num);
  251. }
  252. /**
  253. * 转换为万
  254. *
  255. * @param num
  256. * @param point
  257. * @return
  258. */
  259. public static BigDecimal convertTenThousand(BigDecimal num, int point) {
  260. BigDecimal decimal = num.divide(new BigDecimal(10000), point, RoundingMode.HALF_UP);
  261. return decimal;
  262. }
  263. /**
  264. * 转换为负数
  265. *
  266. * @param num
  267. * @return
  268. */
  269. public static BigDecimal convertToMinusNumber(BigDecimal num) {
  270. if (isLessOrEqual(num, BigDecimal.ZERO)) {
  271. return num;
  272. }
  273. return BigDecimal.ZERO.subtract(num);
  274. }
  275. }