溫馨提示×

溫馨提示×

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

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

Java使用BigDecimal如何實(shí)現(xiàn)精確運(yùn)算浮點(diǎn)數(shù)

發(fā)布時(shí)間:2020-10-26 14:33:39 來源:億速云 閱讀:169 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java使用BigDecimal如何實(shí)現(xiàn)精確運(yùn)算浮點(diǎn)數(shù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

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

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

  // 這個(gè)類不能實(shí)例化
  private ArithmeticUtiles() {
  }

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

  /**
   * 提供精確的減法運(yùn)算
   * 
   * @param v1
   *      被減數(shù)
   * @param v2
   *      減數(shù)
   * @return 兩個(gè)參數(shù)的差
   */
  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();
  }

  /**
   * 提供精確的乘法運(yùn)算
   * 
   * @param v1
   *      被乘數(shù)
   * @param v2
   *      乘數(shù)
   * @return 兩個(gè)參數(shù)的積
   */
  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();
  }

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

  /**
   * 提供(相對)精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指定精度,以后的數(shù)字四舍五入。
   * 
   * @param v1
   *      被除數(shù)
   * @param v2
   *      除數(shù)
   * @param scale
   *      表示表示需要精確到小數(shù)點(diǎn)以后幾位。
   * @return 兩個(gè)參數(shù)的商
   */
  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();
  }

  /**
   * 提供精確的小數(shù)位四舍五入處理。
   * 
   * @param v
   *      需要四舍五入的數(shù)字
   * @param scale
   *      小數(shù)點(diǎn)后保留幾位
   * @return 四舍五入后的結(jié)果
   */
  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();
  }

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

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

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

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

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

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

}

關(guān)于Java使用BigDecimal如何實(shí)現(xiàn)精確運(yùn)算浮點(diǎn)數(shù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI