IllegalFormatPrecisionException при попытке отформатировать строку - PullRequest
4 голосов
/ 08 февраля 2010

Я пытаюсь написать программу, которая предлагает пользователю ввести две матрицы 3 × 3 и отображает их продукт.

Например, пользователь может ввести:

Matrix A: 2 4 6 8 10 12 14 16 18
Matrix B: 1 2 3 4 5.6 6.6 7.4 8.1 9

Ниже я попробовал, но я продолжаю получать эту ошибку. Любая помощь, чтобы указать мне в правильном направлении, будет принята с благодарностью. Я пытаюсь получить его до одного знака после запятой:

Exception in thread "main" java.util.IllegalFormatPrecisionException: 2
    at java.util.Formatter$FormatSpecifier.checkInteger(Formatter.java:2892)
    at java.util.Formatter$FormatSpecifier.(Formatter.java:2643)
    at java.util.Formatter.parse(Formatter.java:2480)
    at java.util.Formatter.format(Formatter.java:2414)
    at java.io.PrintStream.format(PrintStream.java:920)
    at java.io.PrintStream.printf(PrintStream.java:821)
    at Exercise6_25.main(Exercise6_25.java:55)

import java.util.Scanner;

public class matrixCalc
{
    public static void main(String args[])
    {
        Scanner s= new Scanner(System.in);

        int i,j,k;
        int n=3;

        double a[][]= new double[n][n];
        double b[][]= new double[n][n];
        double c[][]= new double[n][n];

        System.out.println("enter the array elements of a:");

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                a[i][j]=s.nextDouble();
            }
            System.out.print(" ");
        }

        System.out.println(" "); 
        System.out.println("enter the array elements of b:");

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                b[i][j]=s.nextDouble();
            }
            System.out.print(" ");
        }

        System.out.println(" ");
        System.out.println("the result matrix is:");

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                for(k=0;k<n;k++)
                {
                    c[i][j]+=a[i][k]*b[k][j];
                }
            }
        }

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                System.out.printf("%.2d", c[i][j]+" ");
            }
            System.out.println();
        }
    }
}

Ответы [ 4 ]

17 голосов
/ 08 февраля 2010

Вы используете спецификатор %d, для которого требуется целочисленный аргумент - но вы даете ему String (потому что c[i][j]+" " преобразует c[i][j] в String при объединении).

Кроме того, спецификатор %d вообще не использует десятичную точку. Поскольку целочисленные типы могут быть неявно преобразованы в типы с плавающей запятой, спецификатор %f - это то, что вы ищете.

И, наконец, число после десятичной точки в спецификаторе формата определяет количество десятичных разрядов. Вы говорите, что хотите только одно десятичное место, поэтому давайте сделаем это 1.

Итак, что мы в итоге получаем:

System.out.printf("%.1f ", c[i][j]); 

См. Formatter Javadocs для (несколько ошеломляющего) описания всех возможных спецификаторов формата. (Не беспокойтесь слишком сильно, если вы не можете понять все там; большая часть этого вам никогда не понадобится.)

6 голосов
/ 08 февраля 2010

Вы не можете отформатировать целые числа, используя десятичную точку в преобразовании. Поскольку c[i][j] является двойным, вы можете использовать преобразование с плавающей запятой :

System.out.printf("%.2f ", c[i][j]);

Вместо:

System.out.printf("%.2d", c[i][j]+" ");

Подробнее о синтаксисе форматера см. На странице справки .

0 голосов
/ 08 февраля 2010

Вы уверены, что хотели сказать «% .2d» в вашем printf, а не «% .2f»? Обычно вы используете только d для целочисленных значений, в вашей матрице есть двойники.

0 голосов
/ 08 февраля 2010

Ваша ошибка, вероятно, здесь:

System.out.printf("%.2d", c[i][j]+" ");

Проверьте документацию о том, как значения форматируются при распечатке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...