如何获得BigDecimal变量的最大可能值? (最好是以编程方式,但硬编码也可以)
修改
好吧,刚才意识到没有这样的东西,因为BigDecimal是任意精度。所以我最终得到了这个,这对我的目的来说足够好了:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)
答案 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或我计算出的精度?