Javadouble的精度问题以及解决方案
java中,使用double进行运算,有时会出现精度丢失的问题,值会有那么0.00000***1偏差的偏差,导致匹配校验常常出现问题
解决方案如下:
  /** 
    * double数据进行取精度
    * @param value  double数据bigdecimal除法保留小数. 
    * @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 double sum(double d1,double d2){
        BigDecimal bd1 = new String(d1));
        BigDecimal bd2 = new String(d2));
        return bd1.add(bd2).doubleValue();
    }
    /**
    * double 相减
    * @param d1
    * @param d2
    * @return
    */
    public double sub(double d1,double d2){
        BigDecimal bd1 = new String(d1));
        BigDecimal bd2 = new String(d2));
        return bd1.subtract(bd2).doubleValue();
    }
    /**
    * double 乘法
    * @param d1
    * @param d2
    * @return
    */
    public double mul(double d1,double d2){
        BigDecimal bd1 = new String(d1));
        BigDecimal bd2 = new String(d2));
        return bd1.multiply(bd2).doubleValue();
    }
    /**
    * double 除法
    * @param d1
    * @param d2
    * @param scale 四舍五入 小数点位数
    * @return
    */
    public double div(double d1,double d2,int scale){
        //  当然在此之前,你要判断分母是否为0 
        //  0你可以根据实际需求做相应的处理
        BigDecimal bd1 = new String(d1));
        BigDecimal bd2 = new String(d2));
        return bd1.divide
              (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript 四舍五入的方法:
小数点问题
und(totalAmount*100)/100 (保留 2 )
function formatFloat(src, pos)
{
  und(src*Math.pow(10, pos))/Math.pow(10, pos);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。