Java的double的精度问题以及解决方案

// 在java中,使用double进行运算,有时会出现精度丢失的问题,值会有那么0.00000***1偏差的偏差,导致匹配校验常常出现问题 解决方案如下:  

//加,乘,除都正常,而且,只要不是这种类型的相减,其他减法也正常
 

//原因:
//因为它的存储形式是二进制的10 进制转化成2进制进行运算可能会误差的,你也可以得到你想要的无精度损失的结果,前提是你将123写成1.23e+2, 123.12写成1.2312e+2双精度形式,
  
//否则从正整型123转化为双精度过程中就可能丢失那么一点精度,因为有限长度的寄存器位仍然无法表示无穷小的精度的。
 /**   
     * 对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();      
  
} 
     


//这样,计算double类型的数据计算问题就可以处理了。另外补充一下JavaScript四舍五入的方法:小数点问题
    
/* Math.round(totalAmount*100)/100;//(保留2位)
     
function formatFloat(src,pos){
     
	returnMath.round(src*Math.pow(10,pos))/Math.pow(10,pos);
     
}*/

 

       

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值