BigDecimal変数が保持できる最大値を取得するにはどうすればよいですか? (できればプログラムで、しかしハードコーディングも大丈夫だろう)
[〜#〜] edit [〜#〜]
OK、BigDecimalは任意の精度であるため、そのようなものは存在しないことに気付きました。だから私はこれで終わりましたが、これは私の目的には十分です:BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)
その任意精度クラスは、コンピューターのメモリーがなくなるまで、必要なだけ大きくなります。
ソースBigDecimalを見ると、基数を持つBigIntegerとして格納されますが、
private BigInteger intVal;
private int scale;
およびBigIntegerから
/** All integers are stored in 2's-complement form.
63: * If words == null, the ival is the value of this BigInteger.
64: * Otherwise, the first ival elements of words make the value
65: * of this BigInteger, stored in little-endian order, 2's-complement form. */
66: private transient int ival;
67: private transient int[] words;
したがって、最大のBigDecimalは、
ival = Integer.MAX_VALUE;
words = new int[Integer.MAX_VALUE];
scale = 0;
設定方法を理解できます。 :P
[編集]だから、それを計算するために、バイナリで、
(2 ^ 35)-2 1(だと思う?)
2の補数で
01111111111111111 ... RAMがいっぱいになるまで。
十分なRAMがある場合、値はおよそ次のとおりです。
2240* 10232
(間違いなく数桁は出ていますが、相対的な観点では非常に正確な見積もりです。)
2 ^ 2147483647-1を表すことができますが、この値の後、一部のメソッドは期待どおりに機能しません。 646456993桁です。
System.out.println(BigInteger.ONE.shiftLeft(Integer.MAX_VALUE)
.subtract(BigInteger.ONE).bitLength());
プリント
2147483647
しかしながら
System.out.println(BigInteger.ONE.shiftLeft(Integer.MAX_VALUE).bitLength());
プリント
-2147483648
ビット数にオーバーフローがあるため。
BigDecimal.MAX_VALUEは十分に大きいため、チェックする必要はありません。