我是靠谱客的博主 大气羽毛,最近开发中收集的这篇文章主要介绍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);
    }
}

最后

以上就是大气羽毛为你收集整理的BigDecimal解决精度问题的全部内容,希望文章能够帮你解决BigDecimal解决精度问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部