Java大數與型別轉換運算
阿新 • • 發佈:2019-01-09
軟體包 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