Программа компилируется, но затем выдает ошибку Exception в потоке "main" java.util.IllegalFormatConversionException: d!= Java.lang.Double?

Моя программа должна распечатать таблицу следующим образом:

  Time          Fraction Since Midnight
     12:00 AM       0.0000
      1:00 AM       0.0417
      2:00 AM       0.0833
      3:00 AM       0.1250
      4:00 AM       0.1667
      5:00 AM       0.2083
      6:00 AM       0.2500
      7:00 AM       0.2917
      8:00 AM       0.3333
      9:00 AM       0.3750
     10:00 AM       0.4167
     11:00 AM       0.4583
     12:00 PM       0.5000
      1:00 PM       0.5417
      2:00 PM       0.5833
      3:00 PM       0.6250
      4:00 PM       0.6667
      5:00 PM       0.7083
      6:00 PM       0.7500
      7:00 PM       0.7917
      8:00 PM       0.8333
      9:00 PM       0.8750
     10:00 PM       0.9167
     11:00 PM       0.9583

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

public class FractionOfDay {
    static double frac = 0;
    static double timeSecs = 0;
    static int time = 0;

    public static void fractionOfDay( int hour, int minute, int second, char 
    half) {


    if (hour == 12 && minute == 0 && second == 0 && half == 'A') 
    {
      frac = 0.0000;
      System.out.printf("%8.4f", frac);

     }

        else if (half == 'A') {
          timeSecs = ((hour * 3600) + (minute * 60) + second);
          frac = (timeSecs / 86400);
          System.out.printf("%8.4f", frac);

    }
    else if (half == 'P') {
     timeSecs = ((hour * 3600) + (minute * 60) + second + (12 * 3600));
     frac = (timeSecs / 86400);
    System.out.printf("%f", frac);

    }

}

public static void main (String [] args) {
    int h = 12;
    double f12 = 0.0000;
    System.out.println("        Time     Fraction Since Midnight");
    System.out.printf("%8d:00 AM\n", h);
    for (int i = 1; i <= 11; i++) {
     System.out.printf("%8d:00 AM\n", i);
    }
    System.out.printf("%8d:00 PM\n", h);
    for (int i = 1; i <= 11; i++) {
     System.out.printf("%8d:00 PM\n", i);
    }

    System.out.printf("%8d:00 PM\n", f12);

     for (int i = 1; i <= 11; i++) {
     fractionOfDay(i, 0, 0, 'A');
    }

    for (int i = 1; i <= 11; i++) {
     fractionOfDay(i, 0, 0, 'P');
    }

}

}

4 ответа

В вашем основном методе вы объявили double f12 = 0.0000; это, тогда вы вызываете System.out.printf("%8d:00 PM\n", f12); что приведет к исключению.

Чтобы решить эту проблему, вы можете изменить тип с double в int поскольку %d в System.out.printf("%8d:00 PM\n", f12); средства int

System.out.printf("%8d:00 PM\n", f12);

f12 удваивается, поэтому может представлять нецелое число часов. Что это значит, по логике? Вы, вероятно, не хотите печатать

3.141592:00 PM

Изменить тип f12 в int,

 System.out.printf("%8d:00 PM\n", f12); 

%d используется для десятичных чисел. Но ваш аргумент имеет тип double. Пожалуйста, посмотрите на форматирование

Измените%d на%s, чтобы это исправить -> System.out.printf("%8s:00 PM\n", f12);

Вы можете изменить код для этого -

System.out.printf("%.4f:00\n", f12);

Также объявите f12 как ниже -

float f12 = 0.0000f;
Другие вопросы по тегам