Java用BigDecimal解决double类型相减时可能存在的误差
double类型的两个数相减可能存在误差,比如System.out.println(2099-1999.9);的结果为99.09999999999991
可以用BigDecimal解决:
publicclassTestDouble{
//两个Double数相减
publicstaticDoublesub(Doubled1,Doubled2){
if(d1==null||d2==null){
returnnull;
}
BigDecimalb1=newBigDecimal(d1.toString());
BigDecimalb2=newBigDecimal(d2.toString());
returnb1.subtract(b2).doubleValue();
}
//两个Double数相加
publicstaticDoubleadd(Doubled1,Doubled2){
if(d1==null||d2==null){
returnnull;
}
BigDecimalb1=newBigDecimal(d1.toString());
BigDecimalb2=newBigDecimal(d2.toString());
returnb1.add(b2).doubleValue();
}
//两个Double数相除,并保留scale位小数
publicstaticDoublediv(Doubled1,Doubled2,intscale){
if(d1==null||d2==null||scale<0){
returnnull;
}
BigDecimalb1=newBigDecimal(d1.toString());
BigDecimalb2=newBigDecimal(d2.toString());
returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
//两个Double数相乘
publicstaticDoublemul(Doubled1,Doubled2){
if(d1==null||d2==null){
returnnull;
}
BigDecimalb1=newBigDecimal(d1.toString());
BigDecimalb2=newBigDecimal(d2.toString());
returnb1.multiply(b2).doubleValue();
}
/**
*遇到.5的情况时往上近似
*
*@paramd
*@paramscale
*@return
*/
publicstaticDoublesetDoubleScale(Doubled,intscale){
if(d==null||scale<0){
returnnull;
}
BigDecimalb=newBigDecimal(d);
returnb.setScale(scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
publicstaticvoidmain(String[]args){
Doubled1=2099d;
Doubled2=1999.999;
System.out.println(d1-d2);
System.out.println(sub(d1,d2));
System.out.println("------------------------------------");
System.out.println(d1*d2);
System.out.println(mul(d1,d2));
System.out.println("------------------------------------");
System.out.println(d1/d2);
System.out.println(div(d1,d2,4));
}
}
结果:
99.00099999999998
99.001
------------------------------------
4197997.901
4197997.901
------------------------------------
1.0495005247502625
1.0495
到此这篇关于Java用BigDecimal解决double类型相减时可能存在的误差的文章就介绍到这了,更多相关Javadouble相减误差内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!