如何在java中没有科学符号或零的情况下打印“双”类型的值?

时间:2015-12-05 16:38:19

标签: java biginteger

我构建了一个使用double类型的程序,它运行良好,但我想要的是用它的所有数字打印最终值。为了解释我正在寻找的东西,我写了这个例子:

    /* 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

BigInteger结果使用了一种值的舍入,我不需要这样。

如何才能获得正确的价值?

2 个答案:

答案 0 :(得分:1)

正如@RealSkeptic和@Ken Slade所说,我需要从BigInteger构建String,而不是Double,而不是 /* 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

结果是对的:

BigInteger

然后我使用Stringstatic void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; Draw(' ', '\u00A9', 20, true); } static void Draw(char sym, char back, int length, bool padding) { if (length < 5) { length = 5; } else if ((length % 2) == 0) // Ensure an odd length using a modulo operation { length++; } if (padding) { Console.WriteLine(new string(back, length)); } int mid = length / 2; int left = mid; int right = mid + 1; do { Console.Write(new string(back, left)); Console.Write(new string(sym, right - left)); Console.Write(new string(back, length - right)); Console.WriteLine(); left--; right++; } while (left != 0); if (padding) { Console.WriteLine(new string(back, length)); } Console.WriteLine(); } 类型从零重建程序。

感谢所有人。

答案 1 :(得分:0)

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

    BigInteger reallyBigInteger2 = new BigDecimal(Big).toBigInteger();

通过传递double值创建 new BigDecimal()对象,然后转换为BigInteger将得到正确的结果。

对于BigDecimal:这有点棘手,因为他们不会做同样的事情。 BigDecimal.valueOf(double)将使用传入的double值的canonical String representation来实例化BigDecimal对象。换句话说:BigDecimal对象的值将是您在执行System.out.println(d)时看到的内容。

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