BigDecimal 用法總結

2022-10-10 06:00:29

轉載請註明出處:

1.BigDecimal 簡介

  在進行浮點數 long 或 double 型別的運算時,如果直接進行運算,浮點數的運算會出現精度失準的情況,特別是在計算和金額相關的運算時,必須計算精確,不能出現誤差,BigDecimal 的出現就是為了解決 浮點數型別的運算精度失準的場景;

  範例:

    public static void main(String[] args) {
        System.out.println(0.2+0.1);
        System.out.println(0.3-0.1);
        System.out.println(0.2*0.1);
        System.out.println(0.3/0.1);
    }

  執行後的結果如下:

                              

2.構造BigDecimal的物件

  BigDecimal提供了豐富的建構函式,可以通過int、long、double、String等來構造一個BigDecimal物件。

  但是,使用double作為引數的建構函式,無法精確構造一個BigDecimal物件,需要自己指定一個上下文的環境,也就是指定精確位。

BigDecimal bg = new BigDecimal(1.1);
System.out.println(bg.toString());
 
執行結果:
1.100000000000000088817841970012523233890533447265625

   所以,通常情況下,我們會使用String物件作為引數來構造一個精確的BigDecimal物件。 下面提供的三種方法都是可以的:

//方法一
BigDecimal bg1 = new BigDecimal("1.1");
//方法二
BigDecimal bg2 = new BigDecimal(Double.toString(1.1));
//方法三
BigDecimal bg3 = BigDecimal.valueOf(1.1);
 
System.out.println(bg1.toString());
System.out.println(bg2.toString());
System.out.println(bg3.toString());
 
執行結果:
1.1
1.1
1.1

3.常用方法總結

  • add(BigDecimal): BigDecimal物件中的值相加,返回BigDecimal物件

  • subtract(BigDecimal): BigDecimal物件中的值相減,返回BigDecimal物件

  • multiply(BigDecimal): BigDecimal物件中的值相乘,返回BigDecimal物件

  • divide(BigDecimal): BigDecimal物件中的值相除,返回BigDecimal物件

  • toString(): 將BigDecimal物件中的值轉換成字串

  • doubleValue(): 將BigDecimal物件中的值轉換成雙精度數

  • floatValue(): 將BigDecimal物件中的值轉換成單精度數

  • longValue(): 將BigDecimal物件中的值轉換成長整數

  • intValue(): 將BigDecimal物件中的值轉換成整數

  • a.max (b) 比較取最大值

  • a.min(b) 比較取最小值

  • a.abs() 取最絕對值

  • negate(): 取相反數

  • (BigDecimal).compareTo(BigDecimal2) : 比較兩個BigDecimal 物件的大小; 返回值為-1,表示bigdemical小於bigdemical2; 返回值為 0,表示bigdemical等於bigdemical2; a = 1,表示bigdemical大於bigdemical2;

4.divide方法使用

  BigDecimal中的divide主要就是用來做除法的運算。 方法定義如下:

public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)

  第一個引數是除數,第二個引數代表保留幾位小數,第三個代表的是使用的模式。 第三個引數可以使用如下常數設定:

BigDecimal.ROUND_DOWN:直接省略多餘的小數,比如1.28如果保留1位小數,得到的就是1.2

BigDecimal.ROUND_UP:直接進位,比如1.21如果保留1位小數,得到的就是1.3

BigDecimal.ROUND_HALF_UP:四捨五入,2.35保留1位,變成2.4

BigDecimal.ROUND_HALF_DOWN:四捨五入,2.35保留1位,變成2.3

後邊兩種的區別就是如果保留的位數的後一位如果正好是5的時候,一個捨棄掉,一個進位。

  進行除法運算,並四捨五入

System.out.println(new BigDecimal("2322").divide(new BigDecimal("209.123345456667"),2, BigDecimal.ROUND_HALF_UP));

  執行結果為 :11.10

5.setScale 方法使用

  setScale(1)表示保留一位小數,預設用四捨五入方式

setScale(1)表示保留一位小數,預設用四捨五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,如果是5則向下舍

  範例:

double dou = 3.14789;
//BigDecimal.ROUND_UP 四捨五入
//BigDecimal.ROUND_DOWN 直接捨棄保留位數之後小數
BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);
double newDouble = bigDecimal.doubleValue();
System.out.println("newDouble:" + newDouble);

   注: 1、BigDecimal.ROUND_UP 四捨五入,BigDecimal.ROUND_DOWN 直接捨棄保留位數之後小數; 2、位數不夠時,不會補齊

6.BigDecimal 資料庫儲存型別對應 decimal

  BigDecimal 資料儲存在 Mysql 的時候,可以使用 decimal 的資料庫資料型別

  decimal(m,d)

  m是數位的最大位數,他的範圍是從1-65;

  d是小數點後的位數,他的範圍是0-30,並且不能大於m。

   如果m被省略了,那麼m的值預設為10,

   如果d被省略了,那麼d的值預設為0.

  舉例表示:

    1、decimal(5,2) 所指代的範圍是-999.99~999.99 數位的最大位數是5位,小數點右側是2位,即有兩位小數。

    2、decimal(7,6)所指代的範圍是-9.999999~9.999999 數位的最大位數是7位,小數點右側是6位,即有六位小數。