package Demo_1.Test_2; import java.math.BigDecimal; /** * @描述:Java Double 精度問題總結 * @詳細描述:使用Java,double 進行運算時,經常出現精度丟失的問題, * 總是在一個正確的結果左右偏0.0000**1。 * 特別在實際項目中,通過一個公式校驗該值是否大於0,如果大於0我們會做一件事情,小於0我們又處理其他事情。 * 這樣的情況通過double計算出來的結果去和0比較大小,尤其是有小數點的時候, * 經常會因為精度丟失而導致程序處理流程出錯。 * @author BrokenColor * @date 2017年3月2日下午1:13:34 */ public class DoubleTest { /** * 對double數據進行取精度. * @param value double數據. * @param scale 精度位數(保留的小數位數). * @param roundingMode 精度取值方式. * @return 精度計算后的數據. */ 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 四舍五入 小數點位數 * @return */ public double div(double d1,double d2,int scale){ // 當然在此之前,你要判斷分母是否為0, // 為0你可以根據實際需求做相應的處理 BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.divide (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } }
文章出處: https://zm8.sm-tc.cn/?src=http%3A%2F%2Fzhaow-381002134.iteye.com%2Fblog%2F420369&uid=4670df527593907cf96038fceebce739&hid=27c1d93952bb3857ef74c1ccb38529f8&pos=1&cid=9&time=1461725514691&from=click&restype=1&pagetype=0000000000000408&bu=web&query=java+double+%E7%9B%B8%E5%87%8F%E7%B2%BE%E5%BA%A6&mode=&uc_param_str=dnntnwvepffrgibijbprsvpi