java的double的精度問(wèn)題(轉(zhuǎn))
在java中,使用double進(jìn)行運(yùn)算,有時(shí)會(huì)出現(xiàn)精度丟失的問(wèn)題,值會(huì)有那么0.00000***1偏差的偏差,導(dǎo)致匹配校驗(yàn)常常出現(xiàn)問(wèn)題
解決方案如下:
/**
* 對(duì)double數(shù)據(jù)進(jìn)行取精度.
* @param value double數(shù)據(jù).
* @param scale 精度位數(shù)(保留的小數(shù)位數(shù)).
* @param roundingMode 精度取值方式.
* @return 精度計(jì)算后的數(shù)據(jù).
*/
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 四舍五入 小數(shù)點(diǎn)位數(shù)
* @return
*/
public double div(double d1,double d2,int scale){
// 當(dāng)然在此之前,你要判斷分母是否為0,
// 為0你可以根據(jù)實(shí)際需求做相應(yīng)的處理
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.divide
(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
這樣,計(jì)算double類型的數(shù)據(jù)計(jì)算問(wèn)題就可以處理了。
另外補(bǔ)充一下 JavaScript 四舍五入的方法:
小數(shù)點(diǎn)問(wèn)題
Math.round(totalAmount*100)/100 (保留 2 位)
function formatFloat(src, pos)
{
return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
}
posted on 2010-06-25 17:17 何方 閱讀(698) 評(píng)論(0) 編輯 收藏 所屬分類: java