JAVA在加減乘除運算時易發(fā)生精度丟失,達不到我們想要的計算結(jié)果;為了能夠精確表示、計算浮點數(shù),JAVA提供了BigDecimal類,可以以BigDecimal為基礎(chǔ)定義一個Arith工具類,代碼如下:
import java.math.BigDecimal;
publicclassArith
{
//默認(rèn)除法運算精度
privatestaticfinalintDEF_DIV_SCALE =10;
//構(gòu)造器私有化,讓這個類不能實例化
privateArith(){}
//提供精確的加法運算
publicstaticdoubleadd(doublev1,doublev2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
returnb1.add(b2).doubleValue();
}
//精確的減法運算
publicstaticdoublesub(doublev1,doublev2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
returnb1.subtract(b2).doubleValue();
}
//精確的乘法運算
publicstaticdoublemul(doublev1,doublev2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
returnb1.multiply(b2).doubleValue();
}
//提供(相對)精確的除法運算,當(dāng)發(fā)生除不盡的情況時
//精確到小數(shù)點后10位的數(shù)字四舍五入
publicstaticdoublediv(doublev1,doublev2)
{
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
returnb1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
publicstaticvoidmain(String[] args)
{
System.out.println("0.05 + 0.01 = "+ Arith.add(0.05,0.01));
System.out.println("1.0 - 0.42 = "+ Arith.sub(1.0,0.42));
System.out.println("4.015*100 = "+ Arith.mul(4.015,100));
System.out.println("123.3/100 = "+ Arith.div(123.3,100));
}
}