1. 程式人生 > 程式設計 >完美解決java double數相加和相減的方案

完美解決java double數相加和相減的方案

我就廢話不多說了,大家還是直接看程式碼吧~

/**
 * double的計算不精確,會有類似0.0000000000000002的誤差,正確的方法是使用BigDecimal或者用整型
 * 整型地方法適合於貨幣精度已知的情況,比如12.11+1.10轉成1211+110計算,最後再/100即可
 * 以下是摘抄的BigDecimal方法:
 */
 public class DoubleUtils implements Serializable {
   private static final long serialVersionUID = -3345205828566485102L;
   // 預設除法運算精度
   private static final Integer DEF_DIV_SCALE = 2;
   /**
   * 提供精確的加法運算。
   *
   * @param value1 被加數
   * @param value2 加數
  * @return 兩個引數的和
  */
  public static Double add(Double value1,Double value2) {
     BigDecimal b1 = new BigDecimal(Double.toString(value1));
     BigDecimal b2 = new BigDecimal(Double.toString(value2));
     return b1.add(b2).doubleValue();
  }
  /**
   * 提供精確的減法運算。
   *
   * @param value1 被減數
   * @param value2 減數
   * @return 兩個引數的差
   */
   public static double sub(Double value1,Double value2) {
     BigDecimal b1 = new BigDecimal(Double.toString(value1));
    BigDecimal b2 = new BigDecimal(Double.toString(value2));
    return b1.subtract(b2).doubleValue();
  }
  /**
   * 提供精確的乘法運算。
   *
   * @param value1 被乘數
   * @param value2 乘數
   * @return 兩個引數的積
   */
   public static Double mul(Double value1,Double value2) {
    BigDecimal b1 = new BigDecimal(Double.toString(value1));
     BigDecimal b2 = new BigDecimal(Double.toString(value2));
    return b1.multiply(b2).doubleValue();
  }
  /**
   * 提供(相對)精確的除法運算,當發生除不盡的情況時, 精確到小數點以後10位,以後的數字四捨五入。
   *
   * @param dividend 被除數
   * @param divisor 除數
   * @return 兩個引數的商
   */
   public static Double divide(Double dividend,Double divisor) {
    return divide(dividend,divisor,DEF_DIV_SCALE);
  }
   /**
   * 提供(相對)精確的除法運算。 當發生除不盡的情況時,由scale引數指定精度,以後的數字四捨五入。
   *
   * @param dividend 被除數
   * @param divisor 除數
   * @param scale  表示表示需要精確到小數點以後幾位。
   * @return 兩個引數的商
   */
   public static Double divide(Double dividend,Double divisor,Integer scale) {
    if (scale < 0) {
      throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(dividend));
   BigDecimal b2 = new BigDecimal(Double.toString(divisor));
     return b1.divide(b2,scale,RoundingMode.HALF_UP).doubleValue();
  }
   /**
   * 提供指定數值的(精確)小數位四捨五入處理。
   *
   * @param value 需要四捨五入的數字
   * @param scale 小數點後保留幾位
   * @return 四捨五入後的結果
   */
  public static double round(double value,int scale){
     if(scale<0){
      throw new IllegalArgumentException("The scale must be a positive integer or zero");
     }
     BigDecimal b = new BigDecimal(Double.toString(value));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one,RoundingMode.HALF_UP).doubleValue();
   }
 }

javascript double相互運算出現小數問題解決

//加法
function numAdd(num1,num2) {  
  var baseNum,baseNum1,baseNum2;  
  try {  
   baseNum1 = num1.toString().split(".")[1].length;  
  } catch (e) {  
   baseNum1 = 0; 
  }  
  try { 
    baseNum2 = num2.toString().split(".")[1].length;  
  } catch (e) { 
   baseNum2 = 0;  
  }  
  baseNum = Math.pow(10,Math.max(baseNum1,baseNum2)); 
  var precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;//精度 
  return ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed(precision);;  
}; 
//減法運算
function numSub(num1,baseNum2;  
  try {  
    baseNum1 = num1.toString().split(".")[1].length;  
  } catch (e) {  
    baseNum1 = 0;  
  }  
  try {  
    baseNum2 = num2.toString().split(".")[1].length;  
  } catch (e) {  
    baseNum2 = 0;  
  }  
  baseNum = Math.pow(10,baseNum2));  
  var precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;  
  return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);  
};  
// 乘法運算  
function numMulti(num1,num2) {  
  var baseNum = 0;  
  try {  
    baseNum += num1.toString().split(".")[1].length;  
  } catch (e) {  
  }  
  try {  
  baseNum += num2.toString().split(".")[1].length;  
  } catch (e) {  
  }  
  return Number(num1.toString().replace(".","")) * Number(num2.toString().replace(".","")) / Math.pow(10,baseNum);  
}; 
// 除法運算,避免資料相除小數點後產生多位數和計算精度損失。  
function numDiv(num1,num2) {  
  var baseNum1 = 0,baseNum2 = 0;  
  var baseNum3,baseNum4;  
  try {  
    baseNum1 = num1.toString().split(".")[1].length;  
  } catch (e) {  
    baseNum1 = 0;  
  }  
  try {  
    baseNum2 = num2.toString().split(".")[1].length;  
  } catch (e) {  
    baseNum2 = 0;  
  }  
  with (Math) {  
    baseNum3 = Number(num1.toString().replace(".",""));  
    baseNum4 = Number(num2.toString().replace(".",""));  
    return (baseNum3 / baseNum4) * pow(10,baseNum2 - baseNum1);  
  }  
};  

補充:java中double、float 型別相同數相減不為0

大家在java程式設計的時候經常會遇到這種情況,兩個float或者double型別的相減,但是他們結果不為0,那我們該怎麼解決呢,下面小編告訴大家一種方法,希望對大家有用。

1、大家先看看這種情況,兩個相同的浮點數相減不為0,

完美解決java double數相加和相減的方案

2、再說下BigDecimal,Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。這時我們就要用BigDecimal,用的時候匯入包java.math.BigDecimal;

完美解決java double數相加和相減的方案

3、我們既然知道要用BigDecimal就行轉化,下面就試試

完美解決java double數相加和相減的方案

4、比較之後我們很容易知道BigDecimal對double、float 型別相同數相減不為0是個有效的方法了

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。