JavaRush /Java Blog /Random-JA /BigInteger と BigDecimal

BigInteger と BigDecimal

Random-JA グループに公開済み
Java では、アプリケーションはクラスで構成され、クラスはメソッドと変数で構成されます。変数は、プリミティブと参照に分けられます。 BigInteger と BigDecimal - 1Java には 8 種類の変数があり、 と を除くbooleanchar次の型に分類されます。
  • 整数: byteshortintおよびlong;
  • 浮動小数点 (実数とも呼ばれます):floatおよびdouble
これらの小さなグループ内では、違いは含まれる値の範囲内にのみ存在します (したがって、そのような変数の占有空間も異なります)。整数型の最大のものは でlong、範囲は -9223372036854775808 から 9223372036854775807 です。浮動小数点数の場合、 はdouble1.7e-308 から 1.7e+308 の範囲になります。実数について詳しくは、この記事をご覧ください。しかし、許容範囲を超える数値を保存する必要がある場合はどうすればよいでしょうか? この場合、BigIntegerと が必要になりますBigDecimal

JavaのBigInteger

Java クラスは、BigIntegerlong の 64 ビット制限がない任意の長さの整数値の類似物として使用されます。Numberさらに、これは、単純な数値型 ( IntegerLong、など) の標準ラッパーと同様に、 class の子孫であるため、単純な型につながるメソッドの実装があり Byteます。Double
BigInteger value = new BigInteger("32145");

int intValue = value.intValue();//32145

long longValue = value.longValue();//32145

double doubleValue = value.doubleValue();//32145.0
BigIntegerすぐに、値が文字列形式でコンストラクターに渡された、 このようなオブジェクトが作成されたことがわかります。彼には、あらゆる機会に複数のデザイナーがいることは注目に値します。プリミティブ型が からのデータの全量を収容できない場合BigInteger、データはそのプリミティブ型の範囲に切り詰められます。しかし同時に、これらのメソッドに類似したメソッド ( など) も存在しますintValueExact()longValueExact()唯一の違いは、変換が行われる単純型がデータ範囲に対応していない場合、ArithmeticExceptionがスローされることです。

BigInteger 定数

内部使用のために、クラスには定数があります。
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
これらは、それぞれ およびのBigInteger値を 持つ定数オブジェクトです 0110

BigInteger メソッド

このクラスの主な特徴の 1 つは、Java の標準算術演算を実装するメソッドが豊富に含まれていることです。例えば:
  • 合計演算:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • 乗算演算:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • ある数値を別の数値で割ったときの余りを求める演算:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • 数値の絶対値を取得します (つまり、符号なしのモジュロ)。

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
より複雑な (特定の) 操作を行うためのメソッドもあります。
  • mod計算を使用した操作:

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
この関数にはいくつかの異なるバリエーションがあります。
  • 乱数を取得し、結果の値が使用するビット数を指定します。

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • ビット単位のシフト演算(this >> n)

    左にシフト:

    BigInteger firstValue = new BigInteger("5");
    BigInteger firstResultValue = firstValue.shiftLeft(3);//40

    右にシフト:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
もちろん、ドキュメント内のメソッドの完全なリストを確認することをお勧めします。 BigInteger と BigDecimal - 2

JavaのBigDecimal

任意の長さの実数が必要な場合は、Java クラスが使用されますBigDecimal。原則として、doubleより多くのカスタマイズ オプションが提供されるため、 の代わりに財務を操作するために使用されます。および と同様BigIntegerBigDecimalはクラスの子孫でありNumber、オブジェクトの値を特定のプリミティブ型として返すメソッドがあります。
BigDecimal value = new BigDecimal(35563.3);

long longValue = value.longValue();//35563

double doubleValue = value.doubleValue();//35563.3
に縮小するとわかるようにlong、整数部分だけが残り、小数点以下の桁は切り捨てられます。

BigDecimal コンストラクター

BigDecimalクラスにははるかに幅広いコンストラクターの選択肢があるため、コンストラクターを詳しく見ていきます。intさまざまな方法 ( 、longdoubleStringさらにはを渡すことによって) でオブジェクトの値を設定できるコンストラクターBigIntegerと、それを許可するコンストラクターがあります。作成したオブジェクトの設定 (丸め方法、小数点以下の桁数) を設定します。
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
ここではすべてが明らかです。確認したい値と小数点以下の桁数を直接設定します。
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
このコンストラクターの結果は非常に予測不可能になる可能性があります。これは、性質上非常に曖昧な型である double を指定しているためです。したがって、通常はコンストラクターで使用することをお勧めしますString
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
を設定しますdoubleが、同時に丸め規則 (小数点以下の桁数と丸めのアルゴリズムを含む) を記述するパラメーターも設定します。
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
オブジェクトの値をどの要素から取得するか、およびこれらの要素をいくつ取得するかという文字の配列を設定します。
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
既存のオブジェクトを取得しBigInteger、小数点以下の桁数を設定します。

BigDecimal メソッド

このクラスにBigDecimalはさまざまな算術演算のメソッドも含まれていますが、BigIntegerのようなビットを操作するメソッドはありません。それにもかかわらず、主な特徴BigDecimalは浮動小数点数を柔軟に操作できることです。実数を習得するためのテクニックをいくつか見てみましょう。
  • 精度 (数値の数) を取得します。

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • 小数点以下の桁数と丸め規則を設定します。

    BigDecimal firstValue = new BigDecimal(3445.544445);
    
    BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545

    以下では、丸めルールを設定するための定数を詳しく見ていきます。

  • 必要な小数点以下の桁数と丸め規則を示しながら、BigDecimal別の で除算します。BigDecimal

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • 小数点を特定の桁数だけ右/左に移動します。

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • 末尾のゼロを削除します。

    BigDecimal value = new BigDecimal("45056.5000");
    BigDecimal result = value.stripTrailingZeros();//45056.5

    実数部がすべて 0 で、全体の部分も 0 である場合 (または小数点以下の桁がまったくない場合)、次のようになります。

    BigDecimal value = new BigDecimal("450000.000");
    BigDecimal result = value.stripTrailingZeros();//4.5E+5

BigDecimal の丸めルール

丸めルールを設定するには、内部でBigDecimal丸めアルゴリズムを記述する特別な定数を確認できます。 ROUND_UP- ゼロからの丸め、実数部への丸め:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_UP );//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UP );//-2.5
ROUND_DOWN— ゼロに丸める、つまり実部の切り捨て:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_DOWN  );//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_DOWN  );//-2.6
ROUND_CEILING— 正の無限大に丸めます。つまり、数値が正の場合は -> ROUND_UP、負の場合は ->ROUND_DOWN
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_CEILING);//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_CEILING);//-2.5
ROUND_FLOOR- 負の無限大に丸める。つまり、数値が正の場合は -> ROUND_DOWN、負の場合は ->ROUND_UP
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_FLOOR);//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_FLOOR);//-2.6
検討中の値については、小数点以下を切り捨てたこの最も近い数値を、検討中の数値の最近傍値とみなします。たとえば、2.43 は 2.5 よりも 2.4 に近づきますが、2.48 は 2.5 に近づきます。 ROUND_HALF_DOWN— 「最近傍」に丸めます。両方の隣接値が特定の値から等距離にある場合、ゼロへの丸めが実行されます。等距離とは、たとえば、四捨五入される数値が 5 で、0 と 10 からの距離が等しい場合です)。
BigDecimal firstValue = new BigDecimal("2.58");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.6
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.5
ROUND_HALF_UP— 「最近傍」に向かって丸めるモード。両方の隣が等距離にある場合、切り上げが行われます (これは学校で教えられたのと同じ丸めです)。
BigDecimal firstValue = new BigDecimal("2.53");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.5
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.6
ROUND_HALF_EVEN— 両方の隣が等距離でない場合は、「最も近い隣」に丸めます。この場合、四捨五入される数値の前に奇数がある場合は切り上げられ、偶数の場合は切り捨てられます。
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
この結果が得られるのは、四捨五入するときに 5 が前の数値 2 を見て、それが偶数であることを見て切り捨てるためです。しかし、次の場合:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
最後の 5 は前の値を調べて奇数になるため、丸めは大きくなります。その結果、数値は 6 に切り上げられ、その後次の 6 も四捨五入されます。しかし、数字が明らかに上に近づいているため、6 は左側の数字を参照しなくなり、その結果、最後の 2 が 1 ずつ増加します。 ROUND_UNNECESSARY- 数字を四捨五入する必要がないことを確認するために使用されます。つまり、数値に必要な小数点以下の桁数があるかどうかを確認します。
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
ここではすべて問題なく、値には 2 桁があり、小数点以下が 2 桁しかないことを確認します。しかし、次の場合:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
ArithmeticException次に、テストされる値が指定された小数点以下の桁数を超えているため、 - が返されます。ただし、小数点以下 2 桁をチェックしても、実際には小数点以下 2 桁が存在する場合、例外はスローされず、欠落している桁は単純にゼロで補われます。
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
BigDecimalまた、 y には、定数および とBigInteger ZERO同様の定数がある ことにも注意してください。ここにドキュメントへのリンクがあります。最後に、おそらくお気づきかと思いますが、オブジェクトとを使用して操作を実行する場合、古いものは変更されず、常に新しいものを取得します。これは、それらが であること、つまり、 と同様に、作成後に変更できないことを示しています。言い換えれば、それらのすべてのメソッドはオブジェクトの内部状態を変更することはできず、せいぜい、使用している関数で指定されたパラメータを持つ新しいオブジェクトを返すことしかできません。 ONETENBigIntegerBigDecimalimmutableString
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION