DecimalCalculate.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package com.goafanti.common.utils;
  2. import java.math.BigDecimal;
  3. public class DecimalCalculate {
  4. // 默认除法运算精度
  5. private static final int DEF_DIV_SCALE = 10;
  6. /**
  7. * 提供精确的加法运算。
  8. *
  9. * @param v1
  10. * 被加数
  11. * @param v2
  12. * 加数
  13. * @return 两个参数的和
  14. */
  15. public static double add(double v1, double v2) {
  16. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  17. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  18. return b1.add(b2).doubleValue();
  19. }
  20. /**
  21. * 提供精确的减法运算。
  22. *
  23. * @param v1
  24. * 被减数
  25. * @param v2
  26. * 减数
  27. * @return 两个参数的差
  28. */
  29. public static double sub(double v1, double v2) {
  30. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  31. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  32. return b1.subtract(b2).doubleValue();
  33. }
  34. /**
  35. * 提供精确的乘法运算。
  36. *
  37. * @param v1
  38. * 被乘数
  39. * @param v2
  40. * 乘数
  41. * @return 两个参数的积
  42. */
  43. public static double mul(double v1, double v2) {
  44. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  45. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  46. return b1.multiply(b2).doubleValue();
  47. }
  48. /**
  49. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
  50. *
  51. * @param v1
  52. * 被除数
  53. * @param v2
  54. * 除数
  55. * @return 两个参数的商
  56. */
  57. public static double div(double v1, double v2) {
  58. return div(v1, v2, DEF_DIV_SCALE);
  59. }
  60. /**
  61. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
  62. *
  63. * @param v1
  64. * 被除数
  65. * @param v2
  66. * 除数
  67. * @param scale
  68. * 表示表示需要精确到小数点以后几位。
  69. * @return 两个参数的商
  70. */
  71. @SuppressWarnings("deprecation")
  72. public static double div(double v1, double v2, int scale) {
  73. if (scale < 0) {
  74. throw new IllegalArgumentException("The scale must be a positive integer or zero");
  75. }
  76. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  77. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  78. return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  79. }
  80. /**
  81. * 提供精确的小数位四舍五入处理。
  82. *
  83. * @param v
  84. * 需要四舍五入的数字
  85. * @param scale
  86. * 小数点后保留几位
  87. * @return 四舍五入后的结果
  88. */
  89. @SuppressWarnings("deprecation")
  90. public static double round(double v, int scale) {
  91. if (scale < 0) {
  92. throw new IllegalArgumentException("The scale must be a positive integer or zero");
  93. }
  94. BigDecimal b = new BigDecimal(Double.toString(v));
  95. BigDecimal one = new BigDecimal("1");
  96. return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  97. }
  98. /**
  99. * 提供精确的类型转换(Float)
  100. *
  101. * @param v
  102. * 需要被转换的数字
  103. * @return 返回转换结果
  104. */
  105. public static float convertsToFloat(double v) {
  106. BigDecimal b = new BigDecimal(v);
  107. return b.floatValue();
  108. }
  109. /**
  110. * 提供精确的类型转换(Int)不进行四舍五入
  111. *
  112. * @param v
  113. * 需要被转换的数字
  114. * @return 返回转换结果
  115. */
  116. public static int convertsToInt(double v) {
  117. BigDecimal b = new BigDecimal(v);
  118. return b.intValue();
  119. }
  120. /**
  121. * 提供精确的类型转换(Long)
  122. *
  123. * @param v
  124. * 需要被转换的数字
  125. * @return 返回转换结果
  126. */
  127. public static long convertsToLong(double v) {
  128. BigDecimal b = new BigDecimal(v);
  129. return b.longValue();
  130. }
  131. /**
  132. * 返回两个数中大的一个值
  133. *
  134. * @param v1
  135. * 需要被对比的第一个数
  136. * @param v2
  137. * 需要被对比的第二个数
  138. * @return 返回两个数中大的一个值
  139. */
  140. public static double returnMax(double v1, double v2) {
  141. BigDecimal b1 = new BigDecimal(v1);
  142. BigDecimal b2 = new BigDecimal(v2);
  143. return b1.max(b2).doubleValue();
  144. }
  145. /**
  146. * 返回两个数中小的一个值
  147. *
  148. * @param v1
  149. * 需要被对比的第一个数
  150. * @param v2
  151. * 需要被对比的第二个数
  152. * @return 返回两个数中小的一个值
  153. */
  154. public static double returnMin(double v1, double v2) {
  155. BigDecimal b1 = new BigDecimal(v1);
  156. BigDecimal b2 = new BigDecimal(v2);
  157. return b1.min(b2).doubleValue();
  158. }
  159. /**
  160. * 精确对比两个数字
  161. *
  162. * @param v1
  163. * 需要被对比的第一个数
  164. * @param v2
  165. * 需要被对比的第二个数
  166. * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
  167. */
  168. public static int compareTo(double v1, double v2) {
  169. BigDecimal b1 = new BigDecimal(v1);
  170. BigDecimal b2 = new BigDecimal(v2);
  171. return b1.compareTo(b2);
  172. }
  173. }