1. 程式人生 > >Java大數與型別轉換運算

Java大數與型別轉換運算

軟體包 java.math 的描述

提供用於執行任意精度整數演算法 (BigInteger) 和任意精度小數演算法 (BigDecimal) 的類。BigInteger 除提供任意精度之外,它類似於 Java 的基本整數型別,因此在 BigInteger 上執行的操作不產生溢位,也不會丟失精度。除標準演算法操作外,BigInteger 還提供模 (modular) 演算法、GCD 計算、基本 (primality) 測試、素數生成、位處理以及一些其他操作。 BigDecimal 提供適用於貨幣計算和類似計算的任意精度的有符號十進位制數字。BigDecimal 允許使用者對舍入行為進行完全控制,並允許使用者選擇所有八個舍入模式。

BigInteger

BigInteger 提供所有 Java 的基本整數操作符的對應物,並提供 java.lang.Math 的所有相關方法。另外,BigInteger 還提供以下運算:模算術、GCD 計算、質數測試、素數生成、位操作以及一些其他操作。

構造方法

方法 功能
BigInteger(byte[] val) 將包含 BigInteger 的二進位制補碼錶示形式的 byte 陣列轉換為 BigInteger。
BigInteger(String val) 將 BigInteger 的十進位制字串表示形式轉換為 BigInteger。
BigInteger(String val, int radix) 指定基數的 BigInteger 的字串表示形式轉換為 BigInteger。
import java.math.*;
import java.util.Scanner;

public class bigInteger {
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        //構造方法1
        System.out.println("輸入大整數"
); BigInteger b=sc.nextBigInteger();//直接讀入大整數,簡單易用,也可以把一個字串當做引數,將字串轉化為大整數 System.out.println(b); //2.將字串看作十進位制大整數 System.out.println("輸入10進位制字串"); String st; st=sc.next();//讀入字串 BigInteger c=new BigInteger(st); System.out.println(c); //3.將字串看作指定基數的大整數 System.out.println("輸入2進位制字串"); st=sc.next(); BigInteger d=new BigInteger(st,2); System.out.println(d); } } ////////////// output 輸入大整數 123456 123456 輸入10進位制字串 123 123 輸入2進位制字串 1000 8

成員方法

方法 功能
add(BigInteger val) 返回其值為 (this + val) 的 BigInteger
subtract(BigInteger val) 返回其值為 (this - val) 的 BigInteger。
multiply(BigInteger val) 返回其值為 (this * val) 的 BigInteger
divide(BigInteger val) 返回其值為 (this / val) 的 BigInteger
mod(BigInteger m) 返回其值為 (this mod m) 的 BigInteger。
negate() 返回其值是 (-this) 的 BigInteger
abs( ) 返回其值是此 BigInteger 的絕對值的 BigInteger
gcd(BigInteger val) 返回一個 BigInteger,其值是 abs(this) 和 abs(val) 的最大公約數。
pow(int exponent) 返回其值為 (thisexponent) 的 BigInteger
modPow(BigInteger exponent, BigInteger m) 返回其值為 (this mod m) 的 BigInteger。
and(BigInteger val) 返回其值為 (this & val) 的 BigInteger。
還有or、not、xor、shiftLeft、shiftRight等方法
compareTo(BigInteger val) 將此 this與val 進行比較。this < val返回-1,this==val返回0,this>val返回1
doubleValue() 將此 BigInteger 轉換為 double
還有intValue、longValue、floatValue
toString() 返回此 BigInteger 的十進位制字串表示形式。
toString(int radix) 返回此 BigInteger 的給定基數的字串表示形式。

BigInteger的進位制轉化

方法 功能
new BigInteger(str,radix) 只能在構造過程中將指定進位制的字串轉化為大整型
this.toString(radix) 將this轉換為制定進位制的字串
 public static  void main(String[] args)
    {
        BigInteger val=new BigInteger("10000000",2);//將指定進位制型別的字串轉化為十進位制的大整形
        System.out.println(val.toString(16));//將大整型轉化為指定型別的字串
    }
    ////
    輸出
    80

BigDecimal

構造方法

BigDecimal(String val) 將 BigDecimal 的字串表示形式轉換成BigDecimal。 這是最穩妥的方法
import java.math.BigDecimal;
import java.util.Scanner;

public class Mainn {
    public static  void main(String[] args)
    {
        //構造方法
        BigDecimal val2=new BigDecimal("123.321");
        System.out.println(val2);

        //輸入方法
        Scanner cin=new Scanner(System.in);
        BigDecimal val3;
        val3=cin.nextBigDecimal();
        System.out.println(val3);
    }
}
/////////
輸入:123.321
輸出:123.321
     123.321

舍入方式

由於Decimal是小數,因此就會遇到舍入的問題,以下是一些引數控制小數部分的舍入方式
首先介紹一個方法num.setScale(scale,RoundingMode.TYPE);這個方法的功能就是將num根據ronudingMode的方式保留scale位小數的舍入

import java.math.BigDecimal;
import java.util.Scanner;

public class Mainn {
    public static  void main(String[] args)
    {
        //輸入方法
        Scanner cin=new Scanner(System.in);
        BigDecimal val=new BigDecimal("1.99999");
        System.out.println(val.setScale(3,BigDecimal.ROUND_UP));//將第四位小數即以後丟掉第三位小數加一
    }
}
///////
輸出:2.000
引數名 功能 輸入 輸出
ROUND_UP 總是將要丟掉的數字前一位的數字加1. 5.5 6
-1.1 -2
ROUND_DOWN 將要丟掉的數字直接丟掉。 5.5 5
-1.1 -1
ROUND_CEILING 使得結果增大 5.5 6
-1.1 -1
ROUND_FLOOR 使得結果減小 5.5 5
-1.1 -2
ROUND_HALF_UP 根據被捨棄的數進行四捨五入 1.9555 1.956(scale=3)
-1.9555 -1.956(scale=3)
ROUND_HALF_DOWN 根據被捨棄的數進行五舍六入 1.9555 1.955
1.9556 1.956
ROUND_HALF_EVEN 如果被捨棄的數字是‘5’,則前一位數向上變為偶數 -1.9515 -1.952(scale=3)
1.9515 1.952(scale=3)
如果被捨棄的數字不是’5’看前一位,前一位是奇數遵循四捨五入,前一位是偶數遵循五舍六入 1.9534 1.953
1.9536 1.954
1.9543 1.954(5舍6入)
1.9547 1.955

成員方法

標度就是小數點後的位數

方法 功能
add(BigDecimal augend) 返回一個 BigDecimal,其值為 (this + augend),其標度為 max(this.scale(), augend.scale())
subtract(BigDecimal subtrahend) 返回一個 BigDecimal,其值為 (this - subtrahend),其標度為 max(this.scale(), subtrahend.scale())。
multiply(BigDecimal multiplicand) 回一個 BigDecimal,其值為 (this × multiplicand),其標度為 (this.scale() + multiplicand.scale())。
divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度
divide(BigDecimal divisor, RoundingMode roundingMode) 返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。
divideToIntegralValue(BigDecimal divisor) 返回 BigDecimal,其值為向下舍入所得商值 (this / divisor) 的整數部分。
remainder(BigDecimal divisor) 返回其值為 (this % divisor) 的 BigDecimal
abs() 返回 BigDecimal,其值為此 BigDecimal 的絕對值,其標度為 this.scale()。
compareTo(BigDecimal val) 將this 與指定的 val 比較。this>val返回1this==val返回0 、this
doubleValue() 各種Value…
movePointLeft(int n) 返回一個 BigDecimal,它等效於將該值的小數點向左移動 n 位
movePointRight(int n) 返回一個 BigDecimal,它等效於將該值的小數點向右移動 n 位。
pow(int n) 返回其值為 (thisn) 的 BigDecimal,準確計算該冪,使其具有無限精度
precision() 返回此 BigDecimal 的精度(有效數字個數)
scale() 返回此 BigDecimal 的標度(小數位數)
toBigInteger() 將此 BigDecimal 轉換為 BigInteger
toString() 返回此 BigDecimal 的字串表示形式,如果需要指數,則使用科學記數法。

Java進位制轉化

最好用的將十進位制整型資料轉化為任意進位制字串

Inter.toString(val,radix);
Long.toString(val,radix);
要求radix<35
this.toString(radix),將this所指的BigInteger物件轉換為制定進位制的字串
public static  void main(String[] args)
    {
        long a=8;
        System.out.println(Long.toString(a,2));
    }
    ////////
    輸出:
    1000

十進位制資料val轉化為2,8,16進位制字串。

資料型別 方法 目的進位制
int Integer.toBinaryString(val) 二進位制
Integer.toOctalString(val) 八進位制
Integer.toHexString(val) 十六進位制
Long Long.toBinaryString(val) 二進位制
Long.toOctalString(val) 八進位制
Long.toHexString(val) 十六進位制

注意:Java中的long型資料對應於long long。long型常數要加字尾L例如:long val=1000000000000L;如果數值不超過int範圍不用加L

public static  void main(String[] args)
    {
        Scanner cin=new Scanner(new BufferedInputStream(System.in));
        Integer a=1024;
        System.out.println(Integer.toBinaryString(a));//將a轉化為2進位制字串
        System.out.println(Integer.toOctalString(a));//轉化為8進位制
       System.out.println(Integer.toHexString(a));//轉化為16進位制
    }
    //////////
    輸出:
    10000000000
    2000
    400

將制定進位制的字串轉化為十進位制

方法 功能
Integer.parseInt(str,radix) radix指定str的進位制,然後轉化為int型資料,省略radix預設十進位制
Double.parseDouble(str,radix) radix指定str的進位制,然後轉化為double型資料,省略radix預設十進位制
Long.parseLong(str,radix) radix指定str的進位制,然後轉化為Long型資料,省略radix預設十進位制
public static  void main(String[] args)
    {
        String str="10000000";
        //int a=Integer.parseInt(str);
        System.out.println(Integer.parseInt(str));//將字串看作10禁止
        System.out.println(Integer.parseInt(str,8));//將字串看作8進位制
        System.out.println(Long.parseLong(str,16));//將字串看作16進位制
    }
    //////
    輸出:
    10000000
    2097152
    268435456