BigDecimal解决精度问题

1、数据库中涉及到金额、价格问题的,建议字段设置成  decimal(m,n),否则会造成精度丢失,对应java中实体类的属性BigDecimal修饰;

2、使用string参数的构造方法,new  BigDecimal(string),若使用double参数的构造方法,会产生你不想要的结果;

3、用compareTo方法比较两值是否相等,而不是equals,equals会比较scale(保留位数),例如2和2.0用equals比较不相等;

4、使用BigDecimal处理高精度的数值计算,是消耗一定的效率为前提的;

5、封装公用类
public class BigDecimalUtil implements Serializable {

    private static final long serialVersionUID = -8410008519165745518L;

    private BigDecimalUtil(){}

    /**
     * 精确加法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal add(String v1,String v2){
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.add(b2));
        return b1.add(b2);
    }

    /**
     * 指定精度的加法(这里四舍五入了,可以替换BigDecimal.ROUND_H ALF_UP)
     * 更过精度可以查看BigDecimal类
     * @param v1
     * @param v2
     * @param scale  保留的位数
     * @return
     */
    public static BigDecimal add(String v1,String v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException("scale must be positive or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.add(b2).setScale(scale,BigDecimal.ROUND_HALF_UP));
        return b1.add(b2).setScale(scale,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 精确减法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static BigDecimal subtract(String v1,String v2){
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.subtract(b2));
        return b1.subtract(b2);
    }

    /**
     * 指定精度的减法
     *
     * @param v1
     * @param v2
     * @param scale
     * @return
     */
    public static BigDecimal subtract(String v1,String v2, int scale){
        if(scale<0){
            throw new IllegalArgumentException("scale must be positive or zero");
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.subtract(b2).setScale(scale,BigDecimal.ROUND_HALF_UP));
        return b1.subtract(b2);
    }

    // 乘法
    public static BigDecimal multiply(String v1,String v2){
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.multiply(b2));
        return b1.multiply(b2);
    }

    // 除法
    public static BigDecimal divide(String v1,String v2){
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        System.out.println(b1.divide(b2, 2 ,BigDecimal.ROUND_HALF_UP));
        return b1.divide(b2, 2 ,BigDecimal.ROUND_HALF_UP);
    }
}

你可能感兴趣的:(Java,Java编程之路)