如何获得最大的BigDecimal值

时间:2011-07-22 15:04:57

标签: java math bigdecimal

如何获得BigDecimal变量的最大可能值? (最好是以编程方式,但硬编码也可以)

修改
好吧,刚才意识到没有这样的东西,因为BigDecimal是任意精度。所以我最终得到了这个,这对我的目的来说足够好了:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)

5 个答案:

答案 0 :(得分:36)

它是一个任意的精度类,它会随着你的计算机内存不足而变得很大。

答案 1 :(得分:13)

查看源代码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填满。

答案 2 :(得分:8)

给定足够的RAM,值大约是:

2 2 40 * 10 2 32

(这绝对是几个数量级,但相对而言,这是一个非常精确的估计。)

答案 3 :(得分:2)

您可以代表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足够大,您无需检查它。

答案 4 :(得分:0)

您可以存储Integer.MAX_VALUE + 1个整数,因为数组从零开始计数。所有这些整数都有32位,因为它们都是无符号处理的。所以位的精度是 32 * 2147483648 = 68719476736位(= 8589934592Byte = 8GiB = 8,6GB)。 要获得以十进制表示的精度,您必须将以位为单位的精度乘以log10(2),以便获得20686623783个完整的十进制数字,是字符串可以存储的四倍多。 现在,您可以将10位数的位数乘以10,然后减去1得到最大的BigDecimal值,但不要尝试使用BigDecimal本身来计算它。 ;)

但是现在的问题是...首先是什么?方法.precision()是否限于Integer.MAX_VALUE或我计算出的精度?