Day42--四捨五入

1hahahahahahahaha發表於2024-12-07

Day42--四捨五入

使用Math.round()方法

  • 原理及用法
    Math.round()是 Java 標準庫中Math類提供的一個用於對浮點數進行四捨五入取整的靜態方法。它接收一個double型別的引數,會根據這個引數的小數部分按照四捨五入的規則返回一個最接近的long型別的整數。例如,如果傳入的引數是12.3,則返回12;如果傳入的引數是12.6,則返回13
  • 程式碼示例
    在你的Student類中,修改getAverageScore方法如下:
public double getAverageScore(int[] scores) {
    int sum = 0;
    for (int i : scores) {
        sum += i;
    }
    double average = (double) sum / scores.length;
    // 使用Math.round()進行四捨五入,由於返回值是long型別,需再轉換回double型別
    average = (double) Math.round(average * 100) / 100;
    return average;
}

這裡先將平均數average乘以100,是為了將需要保留的小數位(這裡想要保留兩位小數)移動到整數位上,然後使用Math.round()進行四捨五入取整,得到一個long型別的結果,再將這個結果除以100並轉換回double型別,就實現了對平均數保留兩位小數的四捨五入操作。

  1. Math.round()方法

    • 語法和基本用法

      • Math.round()java.lang.Math類中的一個靜態方法,用於將一個浮點數進行四捨五入取整。它有兩種過載形式:

        • public static long round(double a):用於將一個double型別的浮點數四捨五入轉換為long型別的整數。例如:
        double num1 = 12.3;
        long result1 = Math.round(num1);
        System.out.println(result1); 
        // 輸出為12,因為12.3四捨五入後為12
        
        • public static int round(float a):用於將一個float型別的浮點數四捨五入轉換為int型別的整數。例如:
        float num2 = 12.7f;
        int result2 = Math.round(num2);
        System.out.println(result2); 
        // 輸出為13,因為12.7四捨五入後為13
        
    • 原理和舍入規則

      • 當小數部分大於等於0.5時,向上取整;當小數部分小於0.5時,向下取整。例如,對於12.5Math.round(12.5)會返回13;對於12.49Math.round(12.49)會返回12
    • 侷限性

      • 它主要用於簡單的取整操作。如果需要精確控制小數位數進行四捨五入,比如保留兩位小數,Math.round()本身不能直接滿足這個需求。需要結合其他操作,如先將數字乘以相應的倍數(如保留兩位小數就乘以100),進行四捨五入後再除以這個倍數,這樣操作相對複雜且容易出錯。
  2. BigDecimal

    • 引入和用途

      • BigDecimal位於java.math.BigDecimal包中,用於高精度的十進位制算術運算。在處理貨幣、財務資料或者需要精確控制小數位數和舍入方式的數值計算時非常有用,因為浮點數(floatdouble)在計算機內部儲存方式的原因,可能會導致精度丟失和不準確的計算結果,而BigDecimal可以避免這些問題。
    • 構造方法

      • 可以透過多種方式構造BigDecimal物件:

        • 使用BigDecimal(String val)建構函式:這是最常用的方式,透過傳入一個表示數字的字串來建立BigDecimal物件,這樣可以確保精確地表示數字。例如:
        BigDecimal bd1 = new BigDecimal("12.345");
        
        • 也可以從其他基本資料型別轉換而來,但這種方式可能會引入精度問題(不推薦),如BigDecimal(double val)建構函式。因為double型別本身的精度問題,在將double值轉換為BigDecimal時可能已經丟失了精度。例如:
        double num = 12.345;
        BigDecimal bd2 = new BigDecimal(num);
        // 可能會出現精度問題,因為num在儲存為double時可能已經有精度損失
        
    • 舍入模式和setScale方法

      • BigDecimal提供了多種舍入模式,這些舍入模式是透過BigDecimal類中的常量來表示的,如ROUND_UP(向上舍入)、ROUND_DOWN(向下舍入)、ROUND_HALF_UP(四捨五入)等。
      • setScale(int newScale, int roundingMode)方法用於設定BigDecimal物件的小數位數(newScale引數)和舍入模式(roundingMode引數)。例如:
      BigDecimal bd3 = new BigDecimal("12.345");
      bd3 = bd3.setScale(2, BigDecimal.ROUND_HALF_UP);
      System.out.println(bd3); 
      // 輸出為12.35,將12.345按照四捨五入保留兩位小數
      
    • 算術運算方法

      • BigDecimal提供了加(add)、減(subtract)、乘(multiply)、除(divide)等算術運算方法。例如:
      BigDecimal num1 = new BigDecimal("2.5");
      BigDecimal num2 = new BigDecimal("1.5");
      BigDecimal sum = num1.add(num2);
      System.out.println(sum); 
      // 輸出為4.0
      
      • 需要注意的是,在進行除法運算時,如果除不盡可能會丟擲ArithmeticException異常,所以通常需要指定舍入模式。例如:
      BigDecimal dividend = new BigDecimal("10");
      BigDecimal divisor = new BigDecimal("3");
      BigDecimal quotient = dividend.divide(divisor, 2, BigDecimal.ROUND_HALF_UP);
      System.out.println(quotient); 
      // 輸出為3.33,將10除以3,結果保留兩位小數並四捨五入
      

相關文章