Я не могу распечатать результаты из класса Math в длинном типе данных в Java? - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать таблицу с n от 16 до 2048 вместе с log (n), n * log (n) ...

Сначала я напечатал результаты дваждыи это сработало очень хорошо, за исключением того факта, что таблица не была выровнена, а скорее испорчена при n = 256. Я полагаю, что результаты могли быть слишком большими для типа данных double, поэтому я переключился на long.

public class FunctionGrowth {
    public static void main(String[] args) {

        long n = 16L;
        System.out.println("log(n) \tn \t\tn*log(n)\t\tn^2 \tn^3 \t\t2^n");

        while(n <= 2048) {
            long l = (long) Math.log(n);
            long nl = (long) (n*Math.log(n));
            long pow = (long) Math.pow(n,2);
            long cube = (long) Math.pow(n,3);
            long pow2 =(long) Math.pow(2,n);

            System.out.printf("%.2d\t%.0d\t\t%.2d\t\t\t%d\t%d\t\t%d\n", l, n, nl, pow, cube, pow2);
            n = n*2;
        }
    }
}

И все же теперь у меня возникла новая проблема: исключение в потоке "main" java.util.IllegalFormatPrecisionException: 2

Я пробовал много способов приведения журнала (n), pow (п, 2) ... от математического класса до длинного, но пока ничего не работает.

Не могли бы вы помочь мне с этой проблемой? Я много борюсь.

Ответы [ 4 ]

0 голосов
/ 06 октября 2019

Это не рекомендуется, но вы можете взломать таким способом.

public static void main(String[] args) {

    long n = 16L;

    // Do use format number accordingly
    int format = 20;

    System.out.printf(
        "%" + format + "s\t" +
            "%" + format + "s\t" +
            "%" + format + "s\t" +
            "%" + format + "s\t"+
            "%" + format + "s\t" +
            "%" + format + "s\n", "log(n)", "(n)", "nlog(n)", "n^2", "n^3", "2^n");

    //System.out.println("log(n) \tn \t\tn*log(n)\t\tn^2 \tn^3 \t\t2^n");

    while (n <= 2048) {
        long l = (long) Math.log(n);
        long nl = (long) (n * Math.log(n));
        long pow = (long) Math.pow(n, 2);
        long cube = (long) Math.pow(n, 3);
        long pow2 = (long) Math.pow(2, n);

        System.out.printf(
            "%" + format + "d\t" +
            "%" + format + "d\t" +
            "%" + format + "d\t" +
            "%" + format + "d\t"+
            "%" + format + "d\t" +
            "%" + format + "d\n", l, n, nl, pow, cube, pow2);
        n = n * 2;
    }
}

OutPut for the above snippet

0 голосов
/ 06 октября 2019

Ошибка, которую вы получаете, заключается в том, что вы форматируете длинные значения в значения int, а int не поддерживает точное форматирование. Попробуйте привести длинные значения к плавающим значениям и изменить спецификатор формата (% .2d и аналогичные) на плавающие спецификаторы (% .2f и аналогичные).

Спасибо

0 голосов
/ 06 октября 2019

Вы можете использовать DecimalFormat:

public static void main(String[] args) {
    long n = 16L;
    System.out.println("log(n) \tn \t\tn*log(n)\t\tn^2 \tn^3 \t\t2^n");

    while(n <= 2048) {
        long l = (long) Math.log(n);
        long nl = (long) (n*Math.log(n));
        long pow = (long) Math.pow(n,2);
        long cube = (long) Math.pow(n,3);
        long pow2 =(long) Math.pow(2,n);

        DecimalFormat df = new DecimalFormat("0.00");
        String format = df.format(l) + "\t" +  df.format((nl)) + "\t" + df.format(pow) + "\t" + df.format(cube) + "\t" + df.format(pow2);
        System.out.println(format);
        n = n*2;
    }
}

Более подробную информацию о DecimalFormat вы можете получить здесь:

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

0 голосов
/ 06 октября 2019

Поведение, которое вы испытали, связано с указанием точности для целочисленных типов, что недопустимо.

Это поведение задано в Javadoc класса Formatter:

Precision

Для общих типов аргументов точность - это максимальное количество символов, которое будет записано в вывод.

Для преобразований с плавающей запятой 'a', 'A', 'e', ​​'E' и 'f' точность - это количество цифр после радикальной точки. Если преобразование - «g» или «G», то точность - это общее количество цифр в полученной величине после округления.

Для символьных целочисленных и типов аргументов даты / времени, а также для преобразования процентов и разделителей строк, точность не применяется;если указана точность, будет сгенерировано исключение .

...