多個double類型的數直接相加的時候,可能存在精度誤差.( 由於計算機算法以及硬件環境決定只能識別 0 1。計算機默認的計算結果在都在一個指定精度范圍之內,想往深的了解,可以學習數值分析等) 在金融方面是絕對不允許的,好在java開發者有這個先見之明。 java.math.*里面提供了BigDecimal類(提供高精度計算的方法)
這個時候就要采用BigDecimal函數進行運算
第一步、建立String類型的數據
第二步、創建BigDecimal對象BigDecimal(Double.toString(double))
以下兩種不推薦:
BigDecimal(double)或者BigDecimal(Double.valueOf(double)))
建議: 涉及到精度問題的時候,整個計算過程都是用String類型或者BigDecimal類對象。最后結果根據需求 在轉過來。
另外該文章提供了一個計算輔助類Java Double相加出現的怪事
急需的話,直接學習、創建該工具類,就可以完成項目了。以下是 加法算法的幾個實現的方法。
new BigDecimal(Double.toString(double)).add(new BigDecimal(Double.toString(double));
1
/**
* @param b1
* BigDecimal
* @param v2
* double
* @return BigDecimal
* */
public BigDecimal add(BigDecimal b1, double v2) {
// BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
/**
* @param b1
* double
* @param v2
* double
* @return BigDecimal
* */
public BigDecimal add(double v1, double v2) {
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
/**
* @param b1
* double
* @param v2
* double
* @return double
* */
public double add(double v1, double v2) {
BigDecimal b1=new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
結論是:
BigDecimal的算法精度比較好。 其余兩種方法 都存在缺點。至於strictfp 這個關鍵字 是去平台化影響。比如32為機器和64位機器結果都一樣。 對於精度計算結果影響不大。