BigDecimalUtil.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package com.fjhx.utils;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. /**
  5. * 精确的浮点数运算
  6. */
  7. public class BigDecimalUtil {
  8. private BigDecimalUtil() {
  9. }
  10. /**
  11. * 值保留几位小数
  12. */
  13. public static BigDecimal keepDecimals(Object value, int scale) {
  14. if (value == null) {
  15. return BigDecimal.ZERO.setScale(scale, RoundingMode.HALF_UP);
  16. }
  17. return (objToBigDecimal(value)).setScale(scale, RoundingMode.HALF_UP);
  18. }
  19. /**
  20. * 默认保留2位小数
  21. */
  22. public static BigDecimal keepDecimals(Object value) {
  23. if (value == null) {
  24. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  25. }
  26. return (objToBigDecimal(value)).setScale(2, RoundingMode.HALF_UP);
  27. }
  28. /**
  29. * 加法运算
  30. */
  31. public static BigDecimal add(Object v1, Object v2) {
  32. return objToBigDecimal(v1).add(objToBigDecimal(v2));
  33. }
  34. /**
  35. * 减法运算
  36. */
  37. public static BigDecimal subtract(Object v1, Object v2) {
  38. return objToBigDecimal(v1).add(objToBigDecimal(v2));
  39. }
  40. /**
  41. * 乘法运算
  42. */
  43. public static BigDecimal multiply(Object v1, Object v2) {
  44. return objToBigDecimal(v1).multiply(objToBigDecimal(v2));
  45. }
  46. /**
  47. * 除法运算
  48. */
  49. public static BigDecimal divide(Object v1, Object v2, int scale) {
  50. return objToBigDecimal(v1).divide(objToBigDecimal(v2), scale, RoundingMode.HALF_UP);
  51. }
  52. /*
  53. * ==============================================================================================
  54. * 以下为链式调用方法
  55. * ==============================================================================================
  56. */
  57. /**
  58. * 结果值
  59. */
  60. private BigDecimal bigDecimal;
  61. /**
  62. * 初始化
  63. */
  64. public static BigDecimalUtil init() {
  65. BigDecimalUtil bigDecimalUtil = new BigDecimalUtil();
  66. bigDecimalUtil.bigDecimal = BigDecimal.ZERO;
  67. return bigDecimalUtil;
  68. }
  69. /**
  70. * 初始化
  71. */
  72. public static BigDecimalUtil init(Object value) {
  73. BigDecimalUtil bigDecimalUtil = new BigDecimalUtil();
  74. bigDecimalUtil.bigDecimal = objToBigDecimal(value);
  75. return bigDecimalUtil;
  76. }
  77. /**
  78. * 加法运算
  79. */
  80. public BigDecimalUtil add(Object value) {
  81. bigDecimal = bigDecimal.add(objToBigDecimal(value));
  82. return this;
  83. }
  84. /**
  85. * 减法运算
  86. */
  87. public BigDecimalUtil subtract(Object value) {
  88. bigDecimal = bigDecimal.subtract(objToBigDecimal(value));
  89. return this;
  90. }
  91. /**
  92. * 乘法运算
  93. */
  94. public BigDecimalUtil multiply(Object value) {
  95. bigDecimal = bigDecimal.multiply(objToBigDecimal(value));
  96. return this;
  97. }
  98. /**
  99. * 除法运算
  100. */
  101. public BigDecimalUtil divide(Object value, int scale) {
  102. bigDecimal = bigDecimal.divide(objToBigDecimal(value), scale, RoundingMode.HALF_UP);
  103. return this;
  104. }
  105. /**
  106. * 除法运算
  107. */
  108. public BigDecimalUtil divideTry(Object value, int scale) {
  109. BigDecimal bigDecimal = objToBigDecimal(value);
  110. if (bigDecimal.compareTo(BigDecimal.ZERO) == 0) {
  111. return this;
  112. }
  113. this.bigDecimal = this.bigDecimal.divide(bigDecimal, scale, RoundingMode.HALF_UP);
  114. return this;
  115. }
  116. /**
  117. * 获取计算结果值
  118. */
  119. public BigDecimal getValue() {
  120. return bigDecimal;
  121. }
  122. /**
  123. * 获取计算结果值,并指定保留位数
  124. */
  125. public BigDecimal getValue(int scale) {
  126. return bigDecimal.setScale(scale, RoundingMode.HALF_UP);
  127. }
  128. /**
  129. * Object转BigDecimal
  130. */
  131. public static BigDecimal objToBigDecimal(Object value) {
  132. if (value == null) {
  133. throw new NullPointerException("参与计算的字段为空");
  134. }
  135. BigDecimal bd;
  136. if (value instanceof BigDecimal) {
  137. bd = (BigDecimal) value;
  138. } else if (value instanceof String) {
  139. bd = new BigDecimal((String) value);
  140. } else if (value instanceof Float) {
  141. bd = BigDecimal.valueOf((float) value);
  142. } else if (value instanceof Double) {
  143. bd = BigDecimal.valueOf((Double) value);
  144. } else if (value instanceof Integer) {
  145. bd = BigDecimal.valueOf((Integer) value);
  146. } else if (value instanceof Long) {
  147. bd = BigDecimal.valueOf((Long) value);
  148. } else {
  149. throw new ArithmeticException("未知的计算类型");
  150. }
  151. return bd;
  152. }
  153. }