有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获取最大的BigDecimal值

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

编辑
好的,刚刚意识到没有这样的事情,因为BigDecimal是任意精度的。因此,我最终得到了一个对于我来说足够大的东西:
BigDecimal my = BigDecimal.valueOf(Double.MAX_VALUE)


共 (5) 个答案

  1. # 1 楼答案

    可以存储整数。最大值+1个整数,因为数组从零开始计数。所有这些整数都有32位,因为它们都是无符号处理的。因此,以位为单位的精度是 32*2147483648=68719476736位(=8589934592字节=8GiB=8,6GB)。 要获得小数精度,必须将位精度与log10(2)相乘,从而得到20686623783个完整的十进制数字,比字符串所能存储的数字高出4倍多。 现在你可以用这个数字量来计算10,然后减去1得到最大的BigDecimal值,但不要试图用BigDecimal本身来计算它

    但现在的问题是。。。首先是什么?方法。precision(),它被限制为整数。最大值还是我的计算精度

  2. # 2 楼答案

    查看源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;
    

    所以最大的十进制数是

    ival = Integer.MAX_VALUE;
    words = new int[Integer.MAX_VALUE]; 
    scale = 0;
    

    你可以想出如何设置P

    [Edit]因此,只需计算一下, 在二进制中

    (2^35)-21(我想是吧?)

    在2的补语中

    011111111111。。。直到你的公羊吃饱为止

  3. # 3 楼答案

    这是一个任意精度的类,在你的计算机内存耗尽之前,它会变得任意大

  4. # 4 楼答案

    您可以表示2^2147483647-1,但在此值之后,某些方法无法按预期工作。它有6456993个数字

    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
    

    因为位的数量出现了溢出

    大十进制。MAX_值足够大,您不需要检查它

  5. # 5 楼答案

    如果有足够的RAM,该值约为:

    2240*10232

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