Java中BigDecimal類

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));
	    }
}

相關鏈接:

https://blog.csdn.net/haiyinshushe/article/details/82721234

https://www.cnblogs.com/javahr/p/8321683.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章