Любой способ избежать результатов, содержащих "9.223372036854776E18" - PullRequest
2 голосов
/ 28 июля 2011

Я делаю программу, которая превращает большое число в строку, а затем добавляет символы этой строки вверх. Это работает нормально, моя единственная проблема в том, что вместо обычного числа 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 ]

1 голос
/ 28 июля 2011

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);
  }
}
1 голос
/ 28 июля 2011

Другие ответы верны, вы можете использовать java.text.NumberFormat ( JavaDoc ) для форматирования вывода.Использование printf также является опцией форматирования, аналогично NumberFormat.Но я вижу здесь кое-что еще.Похоже, вы перепутали свои типы данных: в

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

вы уже усекаете значение двойного возврата от Math до long.Тогда вы должны использовать long в качестве типа данных вместо double для преобразования.Поэтому используйте Long.toString(long), это не добавит никакого показателя экспоненты.

Используйте Long.toString(nq) вместо Double.toString(nq);в вашем коде.

1 голос
/ 28 июля 2011

Как вы говорите: "NumberFormat".Класс.

0 голосов
/ 28 июля 2011

просто замените последнюю строку:

System.out.println(result);

на

System.out.printf("%d", result);
0 голосов
/ 28 июля 2011

Ссылка на Javadoc для NumberFormat: Javadoc

...