Javaビッグディジタル演算
13252 ワード
JavaにはJava.math.BigIntegerクラスとjava.math.BigDecimalクラスという大きな数字の操作クラスが用意されています.この2つのクラスは高精度計算に用いられ,BigIntegerクラスは大きな整数に対する処理であり,BigDecimalクラスは大きな小数に対する処理クラスである.
BigInteger
BigIntegerタイプの数値範囲はIntegerタイプの数値範囲よりずっと大きい.BigIntegerは任意の精度の整数をサポートします.
BigIntegerクラスには複数の操作がカプセル化されており,基本的な加算,減算,乗算,除操作のほか,絶対値,逆数,最大公約数,質数であるか否かの判断などの操作が提供されている.
BigIntegerクラスを使用すると、対応するコンストラクション関数を自動的に呼び出すBigIntegerオブジェクトをインスタンス化できます.BigIntegerクラスには多くのコンストラクション関数がありますが、最も直接的なものは、処理する数値を文字列で表すパラメータです.
BigIntegerクラスでよく使われる演算方法をいくつか挙げます
例:大数の各種演算操作を実現する
BigDecimal
一般的なfloat型とdouble型のデータは科学計算やエンジニアリング計算にのみ使用できますが、商業計算ではデジタル精度が高いことが要求されるためjava.math.BigDecimalクラスが使用されます.BigDecimalクラスは、通貨値を正確に計算するために使用できる任意の精度の定数をサポートします.
2つの一般的な構造方法
例:高精度サイズ演算操作
面接問題
次のプログラムの出力結果は何ですか? A. 6 B. 0 C. 1 D. 3
解析:この問題はJavaの中の大数類を試験します.(1)BigIntegerはjava.math.BigIntegerに属するため、使用するたびにimport(入力)というクラスが必要になります.そうしないとプロンプトが見つかりません.(2)BigIntegerの構造方法はいろいろあります.
(3)BigIntegerクラスはadd()+,divide()−などのすべてのint型数学操作をシミュレートしているが,数学演算を行う場合は数学演算子を直接用いて演算することはできず,その内部手法を用いなければならず,その操作数もBigInteger型でなければならないことに注意する.例えば、two.add(2)は、2がBigInteger型に変更されていないため、誤った操作です.本題では、sumがbigintegerを返す値は元の変数を変更しないので、sumの値は常に0です.6の結果を得るには、次のように明示的に返さなければなりません.
答え:B
BigInteger
BigIntegerタイプの数値範囲はIntegerタイプの数値範囲よりずっと大きい.BigIntegerは任意の精度の整数をサポートします.
BigIntegerクラスには複数の操作がカプセル化されており,基本的な加算,減算,乗算,除操作のほか,絶対値,逆数,最大公約数,質数であるか否かの判断などの操作が提供されている.
BigIntegerクラスを使用すると、対応するコンストラクション関数を自動的に呼び出すBigIntegerオブジェクトをインスタンス化できます.BigIntegerクラスには多くのコンストラクション関数がありますが、最も直接的なものは、処理する数値を文字列で表すパラメータです.
public BigInteger(String val);
val
BigInteger twoInstance = new BigInteger("2");
BigIntegerクラスでよく使われる演算方法をいくつか挙げます
public BigInteger add(BigInteger val);//
public BigInteger subftract(BigInteger val);//
public BigInteger multiply(BigInteger val);//
public BigInteger divide(BigInteger val);//
public BigInteger remainder(BigInteger val);//
public BigInteger[] divideAndReainder(BigInteger val);// , ,
public BigInteger pow(int exponent);// exponent
public BigInteger negate();//
public BigInteger shiftLeft(int n);// n , n ,
public BigInteger shiftRight(int n);// n , n ,
public BigInteger and(BigInteger val);//
public BigInteger or(BigInteger val);//
public int compareTo(BigInteger val);//
public boolean equals(Object x);// x BigInteger , true
public BigInteger min(BigInteger val);//
public BigInteger max(BigInteger val);//
例:大数の各種演算操作を実現する
import java.math.BigInteger;
public class BigIntegerDemo{
public static void main(String[] args){
BigInteger bigInstance = new BigInteger("4");、、
// 2
System.out.println(" :"+bigInstance.add(new BigInteger("2")));
// 2
System.out.println(" :"+bigInstance.subtract(new BigInteger("2")));
// 2
System.out.println(" :"+bigInstance.multiply(new BigInteger("2")));
// 2
System.out.println(" :"+bigInstance.divide(new BigInteger("2")));
// 3
System.out.println(" :"+bigInstance.divideAndReainder(new BigInteger("2"))[0]);
// 3
System.out.println(" :"+bigInstance.divideAndReainder(new BigInteger("2"))[1]);
// 2
System.out.println(" 2 :"+bigInstance.pow(2));
//
System.out.println(" :"+bigInstance.negate());
}
}
BigDecimal
一般的なfloat型とdouble型のデータは科学計算やエンジニアリング計算にのみ使用できますが、商業計算ではデジタル精度が高いことが要求されるためjava.math.BigDecimalクラスが使用されます.BigDecimalクラスは、通貨値を正確に計算するために使用できる任意の精度の定数をサポートします.
2つの一般的な構造方法
publilc BigDecimal(double val);// BigDecimal
public BigDecimal(String val);// BigDecimal
例:高精度サイズ演算操作
import java.math.BigDecimal;
public class BigDecimalDemo{
static final int location = 10;
/**
*/
public BigDecimal add(double value1, double value2){
BigDecimal b1 = new BigDecimal(double.toString(value1));
BigDecimal b2 = new BigDecimal(double.toString(value2));
return b1.add(b2);
}
/**
*/
public BigDecimal add(double value1, double value2){
BigDecimal b1 = new BigDecimal(double.toString(value1));
BigDecimal b2 = new BigDecimal(double.toString(value2));
return b1.subtract(b2);
}
/**
*/
public BigDecimal add(double value1, double value2){
BigDecimal b1 = new BigDecimal(double.toString(value1));
BigDecimal b2 = new BigDecimal(double.toString(value2));
return b1.multiply(b2);
}
/**
*/
public BigDecimal add(double value1, double value2){
return div(value1, value2, location);
}
// ,
public div(double value1, double value2, int b){
if (b < 0) {
System.out.printn("b 0 ");
}
BigDecimal b1 = new BigDecimal(double.toString(value1));
BigDecimal b2 = new BigDecimal(double.toString(value2));
return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);
}
}
面接問題
次のプログラムの出力結果は何ですか?
import java.util.*;
import java.math.BigInteger;
import java.lang.*;
public class Test {
public static void main(String[] args) throws NumberFormatException {
BigInteger one=new BigInteger("1");
BigInteger two=new BigInteger("2");
BigInteger three=new BigInteger("3");
BigInteger sum=new BigInteger("0");
sum.add(one);
sum.add(two);
sum.add(three);
System.out.println(sum.toString());
}
}
解析:この問題はJavaの中の大数類を試験します.(1)BigIntegerはjava.math.BigIntegerに属するため、使用するたびにimport(入力)というクラスが必要になります.そうしないとプロンプトが見つかりません.(2)BigIntegerの構造方法はいろいろあります.
BigInteger(String val)
// BigInteger BigInteger
BigInteger(String val,int radix)
// BigInteger BigInteger
int 2 BigInteger , :
BigInteger two=new BigInteger("2"); // 2
(3)BigIntegerクラスはadd()+,divide()−などのすべてのint型数学操作をシミュレートしているが,数学演算を行う場合は数学演算子を直接用いて演算することはできず,その内部手法を用いなければならず,その操作数もBigInteger型でなければならないことに注意する.例えば、two.add(2)は、2がBigInteger型に変更されていないため、誤った操作です.本題では、sumがbigintegerを返す値は元の変数を変更しないので、sumの値は常に0です.6の結果を得るには、次のように明示的に返さなければなりません.
import java.util.*;
import java.math.BigInteger;
import java.lang.*;
public class Test {
public static void main(String[] args) throws NumberFormatException {
BigInteger one=new BigInteger("1");
BigInteger two=new BigInteger("2");
BigInteger three=new BigInteger("3");
BigInteger sum=new BigInteger("0");
sum = sum.add(one);
sum = sum.add(two);
sum = sum.add(three);
System.out.println(sum.toString());
}
}
答え:B