備忘録がてら。
Javaの[java.math.BigInteger]はlongでも扱えない様な大きな範囲の数値を扱うことができるクラス。
例えばコンストラクタに数値が格納された文字列を渡し、計算させることもできる。
Longの最大値を文字列に変換して与え、1足してみるサンプルは次の通り。
例: Demo1.java
import java.math.BigInteger;
public class Demo1 {
public static void main(String... args) {
BigInteger bigInteger = new BigInteger(Long.toString(Long.MAX_VALUE)); // longの最大値を文字列として与える
System.out.println(bigInteger.toString()); // 9223372036854775807
bigInteger = bigInteger.add(BigInteger.ONE); // 1を加算
System.out.println(bigInteger.toString()); // 9223372036854775808
}
}
ちなみに注意として[java.math.BigInteger.add()]などの計算系のメソッドは、インスタンス自身の値を更新するわけではないので、必ず返り値を格納すること。
このサンプルでは結果を文字列として出力しているだけだが、[java.math.BigInteger]が[java.lang.Number]を継承しているので、各種primitiveな値として取り出すメソッドが用意されている。
([java.math.BigInteger.longValue()]など)
ただし値を返却する際、そのprimitive型の扱える範囲を超えている場合には不正な値が返ってしまう。
それを防ぐためには、それぞれに対応したExactと付いた方のメソッド([java.math.BigInteger.longValueExtract()]など)を利用すると、不正な値を返す代わりに例外として[java.lang.ArithmeticException.ArithmeticException]をスローしてくれる。
またコンストラクタには文字列と共に基数を渡すことができるものが用意されており、36進数まで指定できる。
そのため10進数ではない数値の計算に利用すると便利。
また基数を引数に取る[java.math.BigInteger.toString()]も用意されており、出力することができる。
例: Demo2.java
import java.math.BigInteger;
public class Demo2 {
public static void main(String... args) {
BigInteger bigInteger = new BigInteger("abc", 36); // 36進数のabcを文字列として与える
System.out.println(bigInteger.toString()); // 13368
bigInteger = bigInteger.add(new BigInteger("abc", 36)); // 36進数のabcでBigIntegerを生成し、加算
System.out.println(bigInteger.toString()); // 26736
System.out.println(bigInteger.toString(36)); // kmo
}
}