BigDecimal類介紹
Java中提供了大數字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用於高精度計算.
其中 BigInteger 類是針對大整數的處理類,而 BigDecimal 類則是針對大小數的處理類.
BigDecimal 類的實現用到了 BigInteger類,不同的是 BigDecimal 加入了小數的概念.
float和Double只能用來做科學計算或者是工程計算;在商業計算中,對數字精度要求較高,必須使用 BigInteger 類和 BigDecimal 類,它支持任何精度的定點數,可以用它來精確計算貨幣值.
BigDecimal類創建的是對象,不能使用傳統的+、-、*、/等算術運算符直接對其進行數學運算,而必須調用其對應的方法.方法的參數也必須是BigDecimal類型的對象.
一、構造BigDecimal 對象常用方法
1、方法一
BigDecimal BigDecimal(double d); //不允許使用
2、方法二
BigDecimal BigDecimal(String s); //常用,推薦使用
3、方法三
static BigDecimal valueOf(double d); //常用,推薦使用
注意:
1. double 參數的構造方法,不允許使用!!!!因爲它不能精確的得到相應的值,值會變大;
2. String 構造方法是完全可預知的: 寫入 new BigDecimal("0.1") 將創建一個 BigDecimal,它正好等於預期的0.1; 因此,通常建議優先使用 String 構造方法;
3. 靜態方法 valueOf(double val) 內部實現,仍是將 double 類型轉爲 String 類型; 這通常是將 double(或float)轉化爲 BigDecimal 的首選方法;
代碼測試
我們對其進行加減乘除絕對值的運算
其實就是Bigdecimal的類的一些調用
加法 add()函數 減法subtract()函數
乘法multiply()函數 除法divide()函數 絕對值abs()函數
import java.math.BigDecimal;
public class TestDemo {
public static void main(String[] args) {
BigDecimal num1=new BigDecimal("0.05");
BigDecimal num2=new BigDecimal("1000000");
BigDecimal num3=new BigDecimal("-1000000");
BigDecimal num4=new BigDecimal("1");
BigDecimal num5=new BigDecimal("3");
System.out.println("num1+num2 :"+num1.add(num2));
System.out.println("num1+num3 :"+num1.add(num3));
System.out.println("num2-num1 :"+num2.subtract(num1));
System.out.println("num3-num1 :"+num3.subtract(num1));
System.out.println("num2*num1 :"+num2.multiply(num1));
System.out.println("num3*num1 :"+num3.multiply(num1));
System.out.println("num4/num5,四捨五入: "+num4.divide(num5, 6, BigDecimal.ROUND_HALF_UP) );
System.out.println("num4/num5,向天花板舍入: "+num4.divide(num5, 6, BigDecimal.ROUND_CEILING));
System.out.println("num4/num5,向地板舍入: "+num4.divide(num5, 6, BigDecimal.ROUND_FLOOR));
System.out.println("num4/num5,ROUND_UP: "+num4.divide(num5, 6, BigDecimal.ROUND_UP));
System.out.println("num4/num5,ROUND_DOWN: "+num4.divide(num5, 6, BigDecimal.ROUND_DOWN));
System.out.println("num1絕對值 :"+num1.abs());
System.out.println("num3絕對值 :"+num3.abs());
}
}
結果如下:
除法Divide()參數使用
使用除法函數在divide的時候要設置各種參數,要精確的小數位數和舍入模式,不然會出現報錯
我們可以看到divide函數配置的參數如下
即爲 (BigDecimal divisor 除數, int scale 精確小數位, int roundingMode 舍入模式)
例題
答案:
public class Solution {
public static BigDecimal goldenCoin(double n){ //Decimal
BigDecimal p;
if (n >= 990){ //暴力法解題
p = new BigDecimal("1");
}else {
BigDecimal m = new BigDecimal("1");
for (int i = 0; i < n ; i ++){ //求概率公式
m = m .multiply (new BigDecimal(Double.toString(990 - i)));
m = m.divide(new BigDecimal(Double.toString(1000 - i)), 6, BigDecimal.ROUND_HALF_UP);
}
p = new BigDecimal(1) .subtract(m) ;
}
return p;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
double n = in.nextDouble();
System.out.println(goldenCoin(n).setScale(6,BigDecimal.ROUND_HALF_UP));
}
}
相關鏈接: