Java Double 精度问题总结

package Demo_1.Test_2;

import java.math.BigDecimal;

/**
 * @描述:Java Double 精度问题总结
 * @详细描述:使用Java,double 进行运算时,经常出现精度丢失的问题,
 * 总是在一个正确的结果左右偏0.0000**1。 
 * 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 
 * 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,
 * 经常会因为精度丢失而导致程序处理流程出错。 
 * @author BrokenColor
 * @date 2017年3月2日下午1:13:34
 */
public class DoubleTest {

    /**  
     * 对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 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 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 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 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(); 
     } 
}

文章出处: https://zm8.sm-tc.cn/?src=http%3A%2F%2Fzhaow-381002134.iteye.com%2Fblog%2F420369&uid=4670df527593907cf96038fceebce739&hid=27c1d93952bb3857ef74c1ccb38529f8&pos=1&cid=9&time=1461725514691&from=click&restype=1&pagetype=0000000000000408&bu=web&query=java+double+%E7%9B%B8%E5%87%8F%E7%B2%BE%E5%BA%A6&mode=&uc_param_str=dnntnwvepffrgibijbprsvpi

posted @ 2017-03-02 13:55  BrokenColor  阅读(3096)  评论(0编辑  收藏  举报