任何方法可以避免包含“9.223372036854776E18”的结果

时间:2011-07-28 14:08:21

标签: java math number-formatting

我正在创建一个程序,将大数字转换为字符串,然后添加该字符串的字符。它工作正常,我唯一的问题是,Java不是将它作为正常数字,而是将我的数字转换为标准形式,这使得解析字符串变得困难。这有什么解决方案吗?

public static void main(String ags[]) {
    long nq = (long) Math.pow(2l, 1000l);
    long result = 0;
    String tempQuestion = Double.toString(nq);
    System.out.println(tempQuestion);
    String question = tempQuestion.substring(0, tempQuestion.length() - 2);
    for (int count = 0; count < question.length(); count++) {
        String stringResult = question.substring(count, count + 1);
        result += Double.parseDouble(stringResult);
    }
    System.out.println(result);

5 个答案:

答案 0 :(得分:1)

正如你所说:“NumberFormat”。上课。

答案 1 :(得分:1)

其他答案都是正确的,您可以使用java.text.NumberFormatJavaDoc)格式化输出。使用printf也是格式化选项,类似于NumberFormat。但我在这里看到别的东西。看起来您混淆了数据类型:

nq = (long) Math.pow(2l, 1000l);

您已经将Math的双返回值截断为long。然后,您应该使用long作为数据类型而不是double进行转换。所以使用Long.toString(long),这不会添加任何指数输出。

使用Long.toString(nq)代替Double.toString(nq);在你的代码中。

答案 2 :(得分:1)

BigInteger易于使用,您不会冒使用它的精度问题。 (在这个特定的例子中,我不认为存在精度问题,因为Math.pow(2, 1001) % 100000返回正确的最后5位数,但是对于更大的数字,最终会丢失信息。)以下是使用BigInteger的方法:

groovy:000> b = new BigInteger(2L)
===> 2
groovy:000> b = b.pow(1001)
===> 214301721437253464189685009812000362112280962341106721488750077674070210224
98722449863967576313917162551893458351062936503742905713846280871969155149397149
60786913554964846197084214921012474228375590836430609294996716388253479753511833
1087892154125829142392955373084335320859663305248773674411336138752
groovy:000> ((b + "").toList().collect {new Integer(it)}).inject(0) {sum, n -> sum + n}
===> 1319

Java中也是如此:

public class Example
{
  public static void main(String[] args)
  {
    int sum = 0;
    for (char ch : new java.math.BigInteger("2").pow(1001).toString().toCharArray()) {
      sum += Character.digit(ch, 10);
    }
    System.out.println(sum);
  }
}

答案 3 :(得分:0)

链接到NumberFormat的javadoc:Javadoc

答案 4 :(得分:0)

只需替换最后一行:

System.out.println(result);

System.out.printf("%d", result);