淺析java中的BigDecimal
阿新 • • 發佈:2019-02-12
在精確小數運算中,經常會用到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進行計算。