1. 程式人生 > >淺析java中的BigDecimal

淺析java中的BigDecimal

在精確小數運算中,經常會用到java.math.BigDecimal這個類,那麼BigDecimal到底能參與多大範圍的數字間的運算呢,檢視BigDecimal的註釋:

註釋

意思就是一個Bigdecimal是任意精度的 整數非標度值和32位標度值組成,那麼BigDecimal的最大值,以及最大小數位到底可以是多少呢。通過檢視原始碼可以看到

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    /**
     * The unscaled value of this BigDecimal
     */
private final BigInteger intVal; /** * The scale of this BigDecimal. */ private final int scale; ... }

也就是說一個BigDecimal表示的數字實際上是由BigInteger 來表示這個數字的值,int 來表示有多少個小數位,
比如:
intVal = 1000;
scale = 1;

@Test
public void testVal(){
    BigDecimal bigDecimal2 = new BigDecimal(new
BigInteger("1000"), 1); System.out.println(bigDecimal2); }

那麼這個數字的值實際上是100.0;

所以Bigdecimal能表示的最大整數應該是Biginteger的最大值
最多能有Integer.MAX_VALUE個小數位

另外在利用Bigdecimal做除法時,如果遇到除不盡的情況下,如果不指定精度會丟擲異常。

@Rule
public ExpectedException thrown= ExpectedException.none();

@Test
public void testDivide(){
    BigDecimal ten = new
BigDecimal("10"); BigDecimal three = new BigDecimal("3"); thrown.expect(ArithmeticException.class); thrown.expectMessage("Non-terminating decimal expansion; " + "no exact representable decimal result."); System.out.println(ten.divide(three)); } @Test public void testDivide2(){ BigDecimal ten = new BigDecimal("10"); BigDecimal three = new BigDecimal("3"); System.out.println(ten.divide(three,10,RoundingMode.HALF_UP)); //保留10位小數進行四捨五入 }

此外在運算上面,Bigdecimal會根據數值大小來決定是否使用long值做計算,如果數值比較大才會使用BigInteger進行計算。