double类型的计算——BigDecimal

float和double只能用来做科学计算或者是工程计算,商业计算中我们要用 java.math.BigDecimal!

我们如果需要精确计算,非要用String来够造BigDecimal不可!

public class DoubleUtil implements Serializable {

    // 提供精确的加法运算。

      public static Double add(Double value1, Double value2) {

            BigDecimal b1 = new BigDecimal(Double.toString(value1));

            BigDecimal b2 = new BigDecimal(Double.toString(value2));

            return b1.add(b2).doubleValue();

    }

    // 提供精确的减法运算。

     public static double sub(Double value1, Double value2) {

         BigDecimal b1 = new BigDecimal(Double.toString(value1));

         BigDecimal b2 = new BigDecimal(Double.toString(value2));

         return b1.subtract(b2).doubleValue();

    }

    // 提供精确的乘法运算。

     public static Double mul(Double value1, Double value2) {

         BigDecimal b1 = new BigDecimal(Double.toString(value1));

         BigDecimal b2 = new BigDecimal(Double.toString(value2));

         return b1.multiply(b2).doubleValue();

    }

    // 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。

    // 默认除法运算精度 

     private static final Integer DEF_DIV_SCALE = 2;

     public static Double divide(Double dividend, Double divisor) {

         return divide(dividend, divisor, DEF_DIV_SCALE);

    }

    // 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。

     public static Double divide(Double dividend, Double divisor, Integer scale) {

        if (scale < 0) {

             throw new IllegalArgumentException("The scale must be a positive integer or zero");

        }

         BigDecimal b1 = new BigDecimal(Double.toString(dividend));

         BigDecimal b2 = new BigDecimal(Double.toString(divisor));

         return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue();

    }

    // 提供指定数值的(精确)小数位四舍五入处理。

     public static double round(double value,int scale){

             if(scale<0){

                 throw new IllegalArgumentException("The scale must be a positive integer or zero");             

            }

             BigDecimal b = new BigDecimal(Double.toString(value));    

             BigDecimal one = new BigDecimal("1");

              return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();

    }

}

你可能感兴趣的:(double类型的计算——BigDecimal)