溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java使用BigDecimal如何實現精確運算浮點數

發布時間:2020-10-26 14:33:39 來源:億速云 閱讀:190 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關Java使用BigDecimal如何實現精確運算浮點數,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

/**
 * 進行BigDecimal對象的加減乘除,四舍五入等運算的工具類
 * 
 * @author Marydon
 * @createTime 2017年12月1日上午11:39:15
 * @updateTime
 * @Email:Marydon20170307@163.com
 * @description 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供了精確的浮點數運算,包括加減乘除和四舍五入。
 * @version:1.0.0
 */
public class ArithmeticUtiles {

  /**
   * 進行BigDecimal對象的加減乘除,四舍五入等運算的工具類
   * 
   * @author wupenghui 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精 確的浮點數運算,包括加減乘除和四舍五入。
   */
  // 默認除法運算精度
  private static final int DEF_DIV_SCALE = 10;

  // 這個類不能實例化
  private ArithmeticUtiles() {
  }

  /**
   * 提供精確的加法運算
   * 
   * @param v1
   *      被加數
   * @param v2
   *      加數
   * @return 兩個參數的和
   */
  public static 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();
  }

  /**
   * 提供精確的減法運算
   * 
   * @param v1
   *      被減數
   * @param v2
   *      減數
   * @return 兩個參數的差
   */
  public static double sub(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2).doubleValue();
  }

  /**
   * 提供精確的乘法運算
   * 
   * @param v1
   *      被乘數
   * @param v2
   *      乘數
   * @return 兩個參數的積
   */
  public static double mul(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2).doubleValue();
  }

  /**
   * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以后10位,以后的數字四舍五入
   * 
   * @param v1
   *      被除數
   * @param v2
   *      除數
   * @return 兩個參數的商
   */
  public static double div(double v1, double v2) {
    return div(v1, v2, DEF_DIV_SCALE);
  }

  /**
   * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指定精度,以后的數字四舍五入。
   * 
   * @param v1
   *      被除數
   * @param v2
   *      除數
   * @param scale
   *      表示表示需要精確到小數點以后幾位。
   * @return 兩個參數的商
   */
  public static double div(double v1, double v2, int scale) {
    if (scale < 0) {
      throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  }

  /**
   * 提供精確的小數位四舍五入處理。
   * 
   * @param v
   *      需要四舍五入的數字
   * @param scale
   *      小數點后保留幾位
   * @return 四舍五入后的結果
   */
  public static double round(double v, int scale) {
    if (scale < 0) {
      throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(Double.toString(v));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  }

  /**
   * 提供精確的類型轉換(Float)
   * 
   * @param v
   *      需要被轉換的數字
   * @return 返回轉換結果
   */
  public static float convertsToFloat(double v) {
    BigDecimal b = new BigDecimal(v);
    return b.floatValue();
  }

  /**
   * 提供精確的類型轉換(Int)不進行四舍五入
   * 
   * @param v
   *      需要被轉換的數字
   * @return 返回轉換結果
   */
  public static int convertsToInt(double v) {
    BigDecimal b = new BigDecimal(v);
    return b.intValue();
  }

  /**
   * 提供精確的類型轉換(Long)
   * 
   * @param v
   *      需要被轉換的數字
   * @return 返回轉換結果
   */
  public static long convertsToLong(double v) {
    BigDecimal b = new BigDecimal(v);
    return b.longValue();
  }

  /**
   * 返回兩個數中大的一個值
   * 
   * @param v1
   *      需要被對比的第一個數
   * @param v2
   *      需要被對比的第二個數
   * @return 返回兩個數中大的一個值
   */
  public static double returnMax(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.max(b2).doubleValue();
  }

  /**
   * 返回兩個數中小的一個值
   * 
   * @param v1
   *      需要被對比的第一個數
   * @param v2
   *      需要被對比的第二個數
   * @return 返回兩個數中小的一個值
   */
  public static double returnMin(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.min(b2).doubleValue();
  }

  /**
   * 精確對比兩個數字
   * 
   * @param v1
   *      需要被對比的第一個數
   * @param v2
   *      需要被對比的第二個數
   * 
   * @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1
   */
  public static int compareTo(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.compareTo(b2);
  }

}

關于Java使用BigDecimal如何實現精確運算浮點數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女