Java中的大數據:BigInteger和BigDecimal

Java提供了兩個用於高精度計算的類:BigInteger和BigDecimal。這兩個類包含的方法、提供的操作與對基本類型所能執行的操作相似,只不過是以方法調用方式取代運算符方式來實現。等於是用速度換取了精度。
BigInteger支持任意精度的整數,在運算中可以準確地表示任何大小的整數值,而不會丟失任何信息。BigDecimal支持任何精度的定點數,可以用它進行精確的貨幣計算。

它們都擴展Number類且實現Comparable接口,可以使用new BigInteger(String)或new BigDecimal(String)來創建實例,使用add,substract,multiple,divide和remainder方法完成算數運算,使用compareTo方法比較兩個大數字。

一、常量

BigInteger

ONE,ZERO,TEN分別代表1,0,10。 其定義類似於:

public static final BigInteger ONE = valueOf(1); 

BigDecimal

除了以上三個常量外還有8個關於舍入的常量,這裏不再贅述,可以去查看API的幫助手冊。 順便說一句,BigDecimal由於舍入模式的存在,使得這個類用起來比BigInteger要複雜。

二、聲明賦值

BigInteger

BigInteger bi = new BigInteger(“100”);
BigInteger bi = BigInteger.valueOf(100); 

數組定義與基本類型類似。

BigDecimal

BigDecimal bd = new BigDecimal(100);
BigDecimal bd = BigDecimal.valueOf(100); 

BigDecimal的構造函數比BigInteger多一些,感覺用起來更方便些,比如這樣定義就是錯誤的:BigInteger bi = new BigInteger(100);

順便說一下,java.util包中的Scanner類實現了nextBigInteger()和nextBigDecimal()方法,可以用來讀入控制檯輸入的BigInteger和BigDecimal。

三、相關函數

BigInteger

import java.math.BigInteger;
import java.util.Random;
/*
 * 測試BigInteger類的一些函數
 */
public class BigIntegerDemo 
{
    public static void main(String[] args)
    {
        System.out.println("構造兩個BigInteger對象");
        //BigInteger(int numBits,Random rnd)
        //構造一個隨機生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)範圍內均勻分佈的值
        BigInteger bi1 = new BigInteger(55,new Random());
        System.out.println("bil = " + bi1);

        //BigInteger(byte[] val)   
        //將包含 BigInteger 的二進制補碼錶示形式的 byte 數組轉換爲 BigInteger。
        BigInteger bi2 = new BigInteger(new byte[]{3,2,3});
        System.out.println("bi2 = " + bi2);

        //加
        System.out.println("bi1 + bi2 = " + bi1.add(bi2));
        //減
        System.out.println("bi1 - bi2 = " + bi1.subtract(bi2));
        //乘
        System.out.println("bi1 * bi2 = " + bi1.multiply(bi2));
        //指數運算
        System.out.println("bi1的2次方 = " + bi1.pow(2));
        //整數商
        System.out.println("bi1/bi2的整數商: " + bi1.divide(bi2));
        //餘數
        System.out.println("bi1/bi2的餘數: " + bi1.remainder(bi2));
        //整數商+餘數  
        System.out.println("bi1 / bi2 = " + bi1.divideAndRemainder(bi2)[0] +   
                "--" + bi1.divideAndRemainder(bi2)[1]);
        System.out.println("bi1 + bi2 = " + bi1.add(bi2));  
        //比較大小,也可以用max()和min() 
        if(bi1.compareTo(bi2) > 0)
        {
            System.out.println("bi1 is greater than bi2");
        }
        else if(bi1.compareTo(bi2) == 0)
        {
            System.out.println("bi1 is equal to bi2");
        }
        else if(bi1.compareTo(bi2) < 0) 
        {
            System.out.println("bd1 is lower than bd2");  
        }
        //返回相反數
        BigInteger bi3 = bi1.negate();
        System.out.println("bi1的相反數:" + bi3);
        //返回絕對值
        System.out.println("bi1的絕對值:" + bi3.abs());
    }
}

這裏寫圖片描述

BigDecimal

import java.math.BigDecimal;
/*
 * 測試BigDecimal類的一些函數
 */
public class BigDecimalDemo
{
    public static void main(String[] args)
    {
        System.out.println("構造兩個BigDecimal對象");
        //用char[]數組創建BigDecimal對象,第二個參數爲位移offset,  
        //第三個參數指定長度
        BigDecimal bd1 = new BigDecimal("3464656776868432998434".toCharArray(),2,15);  
        System.out.println("bd1 = " + bd1);  
        //用double類型創建BigDecimal對象  
        BigDecimal bd2 = new BigDecimal(134258767575867.0F);  
        System.out.println("bd2 = " + bd2);

        //加  
        System.out.println("bd1 + bd2 = " + bd1.add(bd2));  
        //減  
        System.out.println("bd1 - bd2 = " + bd1.subtract(bd2));  
        //乘  
        System.out.println("bd1 * bd2 = " + bd1.multiply(bd2));  
        //指數運算  
        System.out.println("bd1的2次方 = " + bd1.pow(2));  
        //取商的整數部分  
        System.out.println("bd1/bd2的整數商: " + bd1.divideToIntegralValue(bd2));  
        //返回餘數計算爲:this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))  
        //System.out.println(bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2)));  
        System.out.println("bd1/bd2的餘數: " + bd1.remainder(bd2));  
        //取商和餘,即bd1.divideToIntegralValue(bd2)與bd1.remainder(bd2)   
        System.out.println("bd1 / bd2 = " + bd1.divideAndRemainder(bd2)[0] +   
                "--" + bd1.divideAndRemainder(bd2)[1]);  
        //比較大小,也可以用max()和min()
        if(bd1.compareTo(bd2) > 0)  

            System.out.println("bd1 is greater than bd2");  

        else if(bd1.compareTo(bd2) == 0)  

            System.out.println("bd1 is equal to bd2");  

        else if(bd1.compareTo(bd2) < 0)  

            System.out.println("bd1 is lower than bd2");  
     //末位數據精度  
     System.out.println("bd1的末位數據精度:  " + bd1.ulp());
     }  
}

這裏寫圖片描述

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