BigDecimal史上最全詳解


本篇主要介紹BigDecimal類型基本操作+保留精度+取整+取余+比較大小+類型轉換

基本操作加,減,乘,除

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal bignum1 = new BigDecimal("7.25");
        BigDecimal bignum2 = new BigDecimal("5.00");
        BigDecimal bignum3 = null;

        //加法
        bignum3 = bignum1.add(bignum2);
        System.out.println("和  是:" + bignum3);

        //減法
        bignum3 = bignum1.subtract(bignum2);
        System.out.println("差  是:" + bignum3);

        //乘法 
        bignum3 = bignum1.multiply(bignum2);
        System.out.println("積  是:" + bignum3);

        //除法
        bignum3 = bignum1.divide(bignum2);
        System.out.println("商  是:" + bignum3);
    }
}

運行結果:

  和 是:12.25
  差 是:2.25
  積 是:36.2500
  商 是:1.45

保留精度及取整(保留0位小數)

  scale為小數位數;roundingMode為小數模式;

  除法保留50位小數:bignum1.divide(bignum2,50,BigDecimal.ROUND_UP);

  乘法保留一位小數: bignum1.multiply(bignum2).setScale(1,BigDecimal.ROUND_HALF_UP);

  乘法運行結果:積 是:36.3

  問題來了,我們不設置精度時是36.2500 保留一位小數時是36.3,這是為什么呢?原來和.ROUND_HALF_UP有關!

不保留小數為例取整,各個roundingMode詳解如下:

ROUND_UP:正數時,舍棄小數后(整數部分)加1,比如12.49結果為13。負數時,舍棄小數后(整數部分)減去1,-12.49結果為 -13

ROUND_DOWN:直接舍棄小數

ROUND_CEILING:如果 BigDecimal 是正的,則做 ROUND_UP 操作;如果為負,則做 ROUND_DOWN 操作 (取附近較大的整數)

ROUND_FLOOR: 如果 BigDecimal 是正的,則做 ROUND_DOWN 操作;如果為負,則做 ROUND_UP 操作(取附近較小的整數)

ROUND_HALF_UP:四舍五入(取更近的整數)

ROUND_HALF_DOWN:同ROUND_HALF_UP 差別僅在於0.5時會向下取整

ROUND_HALF_EVEN:取最近的偶數

ROUND_UNNECESSARY:不需要取整,如果存在小數位,就拋ArithmeticException 異常

  看到這里我們可以推理在保留小數取整的時候,保留一位小數時36.25因為四舍五入到36.3,如果用ROUND_HALF_DOWN那結果就是36.2,如果用ROUND_UP那結果就是36.3,如果用ROUND_DOWN那結果就是36.2

取余(divideAndRemainder方法)

public BigDecimal[] divideAndRemainder(BigDecimal divisor);

該方法接收另一個BigDecimal 對象作為參數,該參數即為除數,返回一個BigDecimal數組,返回數組中包含兩個元素,第一個元素為兩數相除的商,第二個元素為余數。使用案例如下:

package net.csdn.test;
 
import java.math.BigDecimal;
 
public class TestBigDecimal {
    public static void main(String[] args) {
        BigDecimal amt = new BigDecimal(14);
        BigDecimal[] results = amt.divideAndRemainder(BigDecimal.valueOf(5.00));
        System.out.println(results[0]);
        System.out.println(results[1]);
    }
}

運行程序分別輸出商2,余數4.0,可以達到和基本數據類型%運算相同的效果。

比較大小(compareTo)

  int a =baltotal.compareTo(hundred);  若a>0或a=1則baltotal大,a=0則baltotal等於參數,a<0或a=-1則baltotal小

  應用場景:電單車充電以電池電量百分之五為階梯收費,百分之五收0.2元,百分之六收0.4元,這時需要判斷取余后的余數

       是否大於0,int a =baltotal.compareTo(BigDecimal.ZERO);

int與bigdecimal的相互轉換

   int轉bigdecimal

   BigDecimal number = new BigDecimal(0);
   int value=1;
   number=BigDecimal.valueOf((value);

  bigdecimal轉int

BigDecimal b=new BigDecimal(45.45);
int a = b.intValue();


免責聲明!

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



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