Java Double类型数据运算工具(BigDecimal)

     说明:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法,方法中的参数也必须是BigDecimal的对象。 构造器是类的特殊方法, 专门用来创建对象,特别是带有参数的对象
    1、构造器描述
        BigDecimal(int)                创建一个具有参数所指定整数值的对象。
        BigDecimal(double)         创建一个具有参数所指定双精度值的对象。
        BigDecimal(long)             创建一个具有参数所指定长整数值的对象。
        BigDecimal(String)          创建一个具有参数所指定以字符串表示的数值的对象。
    2、方法描述
        add(BigDecimal)            BigDecimal对象中的值相加,然后返回这个对象。
        subtract(BigDecimal)     BigDecimal对象中的值相减,然后返回这个对象。
        multiply(BigDecimal)      BigDecimal对象中的值相乘,然后返回这个对象。
        divide(BigDecimal)         BigDecimal对象中的值相除,然后返回这个对象。
        toString()                        将BigDecimal对象的数值转换成字符串。
        doubleValue()                 将BigDecimal对象中的值以双精度数返回。
        floatValue()                     将BigDecimal对象中的值以单精度数返回。
        longValue()                     将BigDecimal对象中的值以长整数返回。
        intValue()                        将BigDecimal对象中的值以整数返回。
    3、封装的工具类

package gsau

/**
 * @ Description:  Double数据运算工具类
 * @ Date: 2019/11/25 10:27
 * @ Author: wgq
 * @ Version: 1.0
 */
class ArithUtils {
    private static final int DEF_DIV_SCALE = 2;                     //默认除法运算精度
    private static final int DEF_MULTIPLY_SCALE=2                   //默认乘法法运算精度
    private static final int DEF_SUB_SCALE=2                        //默认减法运算精度
    private static final int DEF_ADD_SCALE=2                        //默认加法运算精度
    //这个类不能实例化
    private Arith(){
    }
    /**
     * @ Description: 按给定精度处理一个数据
     * @ Date: 2019/11/25 16:42
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal convert(Object v1,int scale){
        BigDecimal b1 = new BigDecimal(Double.toString(v1)).setScale(scale,BigDecimal.ROUND_HALF_UP);
        return b1.longValue();
    }
    /**
     * @ Description: 提供精确的加法运算。
     * @ param v1 被加数
     * @ param v2 加数
     * @ return 两个参数的和
     * @ Date: 2019/11/25 10:33
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).setScale(DEF_ADD_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * @ Description: 提供精确的减法运算。
     * @ param v1 被减数
     * @ param v2 减数
     * @ return 两个参数的差
     * @ Date: 2019/11/25 10:32
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).setScale(DEF_SUB_SCALE,BigDecimal.ROUND_HALF_UP).longValue();
    }
    /**
     * @ Description:  提供精确的乘法运算。四舍五入保留两位小数
     * @ param v1 被乘数
     * @ param v2 乘数
     * @ param scale 精度值
     * @ return 两个参数的积
     * @ Date: 2019/11/25 10:40
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal mul(double v1,double v2,int scale){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).setScale(scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * @ Description: 提供精确的乘法运算。四舍五入保留两位小数
     * @ param v1 被乘数
     * @ param v2 乘数
     * @ return 两个参数的积
     * @ Date: 2019/11/25 10:32
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).setScale(DEF_MULTIPLY_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * @ Description: 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后2位,以后的数字四舍五入。
     * @ param v1 被除数
     * @ param v2 除数
     * @ return 两个参数的商
     * @ Date: 2019/11/25 10:31
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }

    /**
     * @ Description: 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
     * @ param v1 被除数
     * @ param v2 除数
     * @ param scale 表示表示需要精确到小数点以后几位。
     * @ return 两个参数的商
     * @ Date: 2019/11/25 10:31
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * @ Description:  提供精确的小数位四舍五入处理。
     * @ param v 需要四舍五入的数字
     * @ param scale 小数点后保留几位
     * @ return 四舍五入后的结果
     * @ Date: 2019/11/25 10:33
     * @ Author: wgq
     * @ Version: 1.0
     */
    public static BigDecimal round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

 

你可能感兴趣的:(Java)