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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值