如何打印&x201C;双倍”;在java中键入不带科学符号或零的值?

如何打印&x201C;双倍”;在java中键入不带科学符号或零的值?,java,biginteger,Java,Biginteger,我构建了一个使用双类型的程序,它工作得很好,但我想要的是打印最终值及其所有数字。为了解释我在寻找什么,我写了以下示例: /* sample number my program might generate */ Double Big = new Double ("2937093129380193810983901274934098138098390183"); /* Double.toString(double) method */ String reallyB

我构建了一个使用双类型的程序,它工作得很好,但我想要的是打印最终值及其所有数字。为了解释我在寻找什么,我写了以下示例:

    /* sample number my program might generate */
    Double Big = new Double ("2937093129380193810983901274934098138098390183");

    /* Double.toString(double) method */
    String reallyBigString = Double.toString(Big);
    System.out.println(“Double.toString = " + reallyBigString);

    /* Big Integer class */
    BigInteger reallyBigInteger2 = BigDecimal.valueOf(Big).toBigInteger();
    System.out.println("BigInteger = " + reallyBigInteger2);

    /* BigDecimal class */
    BigDecimal reallyBigInteger1 = new BigDecimal(Big);
    System.out.println("BigDecimal = " + reallyBigInteger1);
我想要的是:

the double real value = 2937093129380193810983901274934098138098390183
我得到的是:

Double.toString = 2.937093129380194E45
BigInteger = 2937093129380194000000000000000000000000000000
BigDecimal = 2937093129380193767890297090901187942913409024
biginger
结果使用了一种对值的舍入,我不需要这样做


如何获得正确的值

您没有使用正确的方法将BigDecimal转换为BigInteger

    BigInteger reallyBigInteger2 = new BigDecimal(Big).toBigInteger();
通过传递双精度值创建新的BigDecimal()对象,然后转换为BigInteger将给出正确的结果

对于BigDecimal:这有点棘手,因为它们做的事情不同。将使用传入的双精度值的值来实例化BigDecimal对象。换句话说:BigDecimal对象的值将是执行System.out.println(d)时看到的值


但是,如果使用新的BigDecimal(d),则BigDecimal将尽可能准确地表示双精度值。这通常会导致存储的数字比您想要的多得多。严格地说,它比valueOf()更正确,但它的直观性要差得多。

正如@realampoint和@Ken Slade所说,我需要从
字符串而不是从
构造
大整数,就是这样:

    /* the sample number converted to a String*/
    String Big = new String ("2937093129380193810983901274934098138098390183");

    /* BigInteger */
    BigInteger reallyBigInteger = new BigInteger(Big);
    System.out.println("BigInteger = " + reallyBigInteger);
结果是正确的:

BigInteger = 2937093129380193810983901274934098138098390183
然后我使用
biginger
String
类型从零开始重建程序


多亏了大家。

这个数字不能准确地存储在一个双精度存储器中。一旦你把它放进那双盒子里,它就会丢失一些信息。如果你想让它精确,你需要直接把它放在
BigDecimal
biginger
中,而不是由一个double中介。正如@realpoinsist所说,你需要从
字符串
构造你的
biginger
,而不是试图从
double
构造它。因此,使用
新的biginger(“293709312938019381098390127493409838098390183”)
应该会得到正确的结果。double只能精确到15-17位