我如何获得 BigDecimal 变量可以容纳的最大可能值?(最好是用编程方式,但硬编码也可以)
编辑
好吧,我刚才意识到这样的东西不存在,因为 BigDecimal 具有任意精度。所以我最终采用了这个值,它足够大:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)
我如何获得 BigDecimal 变量可以容纳的最大可能值?(最好是用编程方式,但硬编码也可以)
编辑
好吧,我刚才意识到这样的东西不存在,因为 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
[编辑] 所以只需计算,
在二进制中是这样的,如果内存足够大,则值约为:
2240*10232
(虽然存在一些数量级的误差,但相对而言,这是一个非常精确的估计。)
BigDecimal
表示的数字值为 (unscaledValue × 10-scale)
。但我认为我使用了一个 byte
后备数组来存储未缩放值的 BigInteger
,而不是一个 int
,所以我已经“略微”低估了真正的限制。 - 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已经足够大,您不需要检查它。
Integer.MAX_VALUE + 1
个条目,那么数组的长度将是多少?由于整数属性与数组一起存储,因此它的长度不能超过Integer.MAX_VALUE
。 - geanakuch