Как получить наибольшее значение BigDecimal - PullRequest
35 голосов
/ 22 июля 2011

Как я могу получить максимально возможное значение переменной BigDecimal? (Желательно программно, но было бы неплохо и жесткое кодирование)

EDIT
Хорошо, только что понял, что такого нет, поскольку BigDecimal имеет произвольную точность. Так что я закончил с этим, что достаточно хорошо для моей цели:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)

Ответы [ 4 ]

37 голосов
/ 22 июля 2011

Это класс произвольной точности, он будет настолько большим, насколько вы захотите, пока на вашем компьютере не кончится память.

13 голосов
/ 22 июля 2011

Глядя на источник, 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;

Вы можете выяснить, как установить это. : Р

[Редактировать] Так что просто для расчета, В двоичном виде это,

(2 ^ 35) -2 1 (я думаю?)

в дополнении 2

01111111111111111 ... пока память не заполнится.

8 голосов
/ 22 июля 2011

При достаточном объеме оперативной памяти это значение приблизительно равно:

2 2 40 * 10 2 32

(Это определенно на несколько порядков, но в относительном выражении это очень точная оценка.)

2 голосов
/ 22 июля 2011

Вы можете представить 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 достаточно велик, поэтому вам не нужно проверять его.

...