BigDecimal实现加减乘除精度处理

  • 在实际开发中,当我们遇到金额的计算时,会面临精度丢失的问题,那么这个时候就需要用BigDecimal来对数据进行处理。以下给出详细的实现加减乘除的放法:
 /**   
     * 对double数据进行取精度.   
     * @param value  double数据.   
     * @param scale  精度位数(保留的小数位数).   
     * @param roundingMode  精度取值方式.   
     * @return 精度计算后的数据.   
     */   
    public static double round(double value, int scale,  
             int roundingMode) {    
        BigDecimal bd = new BigDecimal(value);    
        bd = bd.setScale(scale, roundingMode);    
        double d = bd.doubleValue();    
        bd = null;    
        return d;    
    }    


     /** 
     * double 相加 
     * @param d1 
     * @param d2 
     * @return 
     */ 
    public static double sum(double d1,double d2){ 
        BigDecimal bd1 = new BigDecimal(Double.toString(d1)); 
        BigDecimal bd2 = new BigDecimal(Double.toString(d2)); 
        return bd1.add(bd2).doubleValue(); 
    } 


    /** 
     * double 相减 
     * @param d1 
     * @param d2 
     * @return 
     */ 
    public static double sub(double d1,double d2){ 
        BigDecimal bd1 = new BigDecimal(Double.toString(d1)); 
        BigDecimal bd2 = new BigDecimal(Double.toString(d2)); 
        return bd1.subtract(bd2).doubleValue(); 
    } 

    /** 
     * double 乘法 
     * @param d1 
     * @param d2 
     * @return 
     */ 
    public static double mul(double d1,double d2){ 
        BigDecimal bd1 = new BigDecimal(Double.toString(d1)); 
        BigDecimal bd2 = new BigDecimal(Double.toString(d2)); 
        return bd1.multiply(bd2).doubleValue(); 
    } 


    /** 
     * double 除法 
     * @param d1 
     * @param d2 
     * @param scale 四舍五入 小数点位数 
     * @return 
     */ 
    public static double div(double d1,double d2,int scale){ 
        //  当然在此之前,你要判断分母是否为0,    
        //  为0你可以根据实际需求做相应的处理 

        BigDecimal bd1 = new BigDecimal(Double.toString(d1)); 
        BigDecimal bd2 = new BigDecimal(Double.toString(d2)); 
        return bd1.divide  
               (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
BigDecimal 是 Java 中用于处理精度问题的类,但是在进行加减乘除运算时,也需要注意精度问题。 1. 加减法精度问题 在进行 BigDecimal 的加减法运算时,需要注意两个 BigDecimal 对象的精度是否相同。如果两个 BigDecimal 对象的精度不同,那么结果的精度可能会有误差。 例如,假设有两个 BigDecimal 对象: BigDecimal a = new BigDecimal("10.123456789"); BigDecimal b = new BigDecimal("0.000000001"); 如果对它们进行加法运算,结果应该是 10.123456790。但是,如果直接使用 a.add(b),会得到一个不精确的结果: BigDecimal c = a.add(b); // 结果可能是 10.123456789 这是因为 a 和 b 的精度不同,导致加法运算时精度丢失。解决方法是将两个 BigDecimal 对象的精度设置为相同的值,如下所示: BigDecimal a = new BigDecimal("10.123456789").setScale(9, RoundingMode.HALF_UP); BigDecimal b = new BigDecimal("0.000000001").setScale(9, RoundingMode.HALF_UP); BigDecimal c = a.add(b); // 结果为 10.123456790 在这里,使用了 setScale 方法将 a 和 b 的精度设置为 9,同时使用了 RoundingMode.HALF_UP 舍入模式来保证精度。 2. 乘除法精度问题 在进行 BigDecimal 的乘除法运算时,也可能会出现精度问题。例如,假设有两个 BigDecimal 对象: BigDecimal a = new BigDecimal("10.0"); BigDecimal b = new BigDecimal("3.0"); 如果对它们进行除法运算,结果应该是 3.3333333333。但是,如果直接使用 a.divide(b),会得到一个不精确的结果: BigDecimal c = a.divide(b); // 结果可能是 3.333333333 这是因为 BigDecimal 的除法运算默认是保留整数部分,精度有可能丢失。解决方法是使用重载的 divide 方法,指定要保留的小数位数和舍入模式,如下所示: BigDecimal c = a.divide(b, 10, RoundingMode.HALF_UP); // 结果为 3.3333333333 在这里,使用了保留 10 位小数和 RoundingMode.HALF_UP 舍入模式来保证精度。乘法运算也可以使用 setScale 方法来设置精度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值