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