Java 學習筆記---Java double類型相加問題


多個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位機器結果都一樣。 對於精度計算結果影響不大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM