BigDecimalUtil.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.steerinfo.ems.Utils;
  2. import java.math.BigDecimal;
  3. import java.math.RoundingMode;
  4. public class BigDecimalUtil {
  5. // 默认除法运算精度
  6. private static final Integer DEF_DIV_SCALE = 2;
  7. /**
  8. * 提供精确的加法运算。
  9. *
  10. * @param value1 被加数
  11. * @param value2 加数
  12. * @return 两个参数的和
  13. */
  14. public static BigDecimal add(Double value1,Double value2 ) {
  15. BigDecimal b1 = new BigDecimal(Double.toString(value1));
  16. BigDecimal b2 = new BigDecimal(Double.toString(value2));
  17. return b1.add(b2);
  18. }
  19. /**
  20. * 减法
  21. * @param value1
  22. * @param value2
  23. * @return
  24. */
  25. public static BigDecimal sub(Double value1,Double value2) {
  26. BigDecimal b1 = new BigDecimal(Double.toString(value1));
  27. BigDecimal b2 = new BigDecimal(Double.toString(value2));
  28. return b1.subtract(b2);
  29. }
  30. /**
  31. * 提供精确的乘法运算。
  32. *
  33. * @param value1 被乘数
  34. * @param value2 乘数
  35. * @return 两个参数的积
  36. */
  37. public static BigDecimal mul(Double value1,Double value2) {
  38. BigDecimal b1 = new BigDecimal(Double.toString(value1));
  39. BigDecimal b2 = new BigDecimal(Double.toString(value2));
  40. return b1.multiply(b2);
  41. }
  42. public static Float mul(Float value1,Float value2) {
  43. BigDecimal b1 = new BigDecimal(Float.toString(value1));
  44. BigDecimal b2 = new BigDecimal(Float.toString(value1));
  45. return b1.multiply(b2).floatValue();
  46. }
  47. public static int mulOneHundred(Double value1) {
  48. BigDecimal b1 = new BigDecimal(Double.toString(value1));
  49. BigDecimal b2 = new BigDecimal(Double.toString(100));
  50. return b1.multiply(b2).intValue();
  51. }
  52. /**
  53. * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
  54. *
  55. * @param dividend
  56. * 被除数
  57. * @param divisor
  58. * 除数
  59. * @param scale
  60. * 表示表示需要精确到小数点以后几位。
  61. * @return 两个参数的商
  62. */
  63. public static BigDecimal divide(Double dividend, Double divisor, Integer scale) {
  64. if (scale < 0) {
  65. throw new IllegalArgumentException("The scale must be a positive integer or zero");
  66. }
  67. BigDecimal b1 = new BigDecimal(Double.toString(dividend));
  68. BigDecimal b2 = new BigDecimal(Double.toString(divisor));
  69. try {
  70. BigDecimal sum = b1.divide(b2, scale, RoundingMode.HALF_UP);
  71. return sum;
  72. } catch (ArithmeticException e) {
  73. return BigDecimal.ZERO;
  74. }
  75. }
  76. public static Float divide(Float dividend, Float divisor, Integer scale) {
  77. if (scale < 0) {
  78. throw new IllegalArgumentException("The scale must be a positive integer or zero");
  79. }
  80. BigDecimal b1 = new BigDecimal(Double.toString(dividend));
  81. BigDecimal b2 = new BigDecimal(Double.toString(divisor));
  82. try {
  83. b1.divide(b2, scale, RoundingMode.HALF_UP).floatValue();
  84. } catch (Exception e) {
  85. System.out.println("累计量为0");
  86. }
  87. return b1.divide(b2, scale, RoundingMode.HALF_UP).floatValue();
  88. }
  89. }