【Java】使用BigDecimal類進行精確小數計算


在商業計算中(尤其是計算價格)需要使用BigDecimal類來進行精確小數計算,因為用其他類型計算(如double)得到的結果不是精確的!

寫個測試類。

import org.junit.Test;
import java.math.BigDecimal;

public class BigDecimalTest {

    @Test
    public void test1(){
        System.out.println(0.05 + 0.01); // 0.060000000000000005
        System.out.println(1 - 0.42);    // 0.5800000000000001
        System.out.println(4.015 * 100); // 401.49999999999994
        System.out.println(123.3 / 100); // 1.2329999999999999
    }

    @Test
    public void test2(){
        BigDecimal b1 = new BigDecimal(0.05);
        BigDecimal b2 = new BigDecimal(0.01);
        System.out.println(b1.add(b2)); // 0.06000000000000000298372437868010820238851010799407958984375
    }

    @Test
    public void test3(){
        BigDecimal b1 = new BigDecimal("0.05");
        BigDecimal b2 = new BigDecimal("0.01");
        System.out.println(b1.add(b2)); // 0.06
    }
}

小結一:關於BigDecimal類的使用方法。

  • System.out.println()中的數字默認是double類型的,double類型小數計算不精准。
  • 使用BigDecimal類構造方法傳入double類型時,計算的結果也是不精確的!必須改用傳入String的構造方法。這一點在BigDecimal類的構造方法注釋中有說明。
  • 實際項目中,數據庫存的通常是float或double類型,所以計算時需要頻繁進行轉換,通常需要單獨封裝一個轉換方法。

封裝一個工具類BigDecimalUtil.java

import java.math.BigDecimal;

public class BigDecimalUtil {

    // 私有構造方法,防止外部new
    private BigDecimalUtil(){}

    // 加法。
    public static BigDecimal add(double v1, double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }

    // 減法。
    public static BigDecimal sub(double v1, double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2);
    }

    // 乘法。
    public static BigDecimal mul(double v1, double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2);
    }

    // 除法。
    public static BigDecimal div(double v1, double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); // 四舍五入,保留2位小數
    }
}

 

小結二:關於JUnit單元測試的使用方法。

  • 新建一個類做單元測試,通常在目錄“項目名/src/test/java/”下。
  • 編寫測試方法,標注上@Test,即可右鍵運行該測試方法,而不需要寫主函數調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM