web-dev-qa-db-ja.com

最大のBigDecimal値を取得する方法

BigDecimal変数が保持できる最大値を取得するにはどうすればよいですか? (できればプログラムで、しかしハードコーディングも大丈夫だろう)

[〜#〜] edit [〜#〜]
OK、BigDecimalは任意の精度であるため、そのようなものは存在しないことに気付きました。だから私はこれで終わりましたが、これは私の目的には十分です:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)

35
Caner

その任意精度クラスは、コンピューターのメモリーがなくなるまで、必要なだけ大きくなります。

39
alexblum

ソース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がいっぱいになるまで。

13
Andrew

十分なRAMがある場合、値はおよそ次のとおりです。

2240* 10232

(間違いなく数桁は出ていますが、相対的な観点では非常に正確な見積もりです。)

8
biziclop

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は十分に大きいため、チェックする必要はありません。

2
Peter Lawrey