2015-02-12 4 views
0

Я искал вокруг и не нашел здесь прецедента для этой конкретной проблемы. Процитированный, я рассмотрел следующие вопросы.Java: ошибка форматирования с использованием printf

using printf for multiple formats

Formatting using printf and format

Formatting problems using printf in java

Ниже я опишу фрагмент моего кода, где у меня возникли проблемы. Пожалуйста, имейте в виду, я пытаюсь понять выходы Efficiency лучше, и я изучает в то, почему некоторые входы вызывают там быть экспоненциальной, логарифмической, линейный рост, и т.д. и т.п. В любом случае ...

for (int i = 0; i < 5; i++) { 
    time = System.nanoTime(); 
    tl.timeTrial(N); 
    elapsedTime = (System.nanoTime() - time)/BILLION; 
    System.out.print(N + "\t"); 
    System.out.printf("%4.3f\t", elapsedTime); 
    if (i != 0) { 
     r = elapsedTime/previousTime; 
     System.out.printf("%3.2\t", r); 
     k = Math.log(r); 
     System.out.printf("%3.2\n", k); 
    } 
    else { 
     System.out.print("\n"); 
    } 

    previousTime = elapsedTime; 
    N *= 2; 
    } 

Отсюда я буду укажите несколько вещей.

System.out.printf("%4.3\t", elapsedTime); 

компилируется и работает отлично. Однако, когда я попадаю в оператор if с r и k, я получаю ошибку во время выполнения, и я не понимаю, почему я понимаю, почему. Ошибка заключается в следующем:

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '4' 
at java.util.Formatter.checkText(Formatter.java:2579) 
at java.util.Formatter.parse(Formatter.java:2565) 
at java.util.Formatter.format(Formatter.java:2501) 
at java.io.PrintStream.format(PrintStream.java:970) 
at java.io.PrintStream.printf(PrintStream.java:871) 
at TimingLabClient.main(TimingLabClient.java:61) 

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

спасибо. Для тех, кто запутался в моих \ t и \ ns, он помогает с выходным форматом, который не обязательно должен быть идеальным.

N Time(sec) R K 
8 0.723 
16 5.760 7.964 2.075 
32 47.098 8.176 2.101 

Эта программа действительно собирается работать около 7 часов ...

+0

У вас нет спецификатора формата. Вы действительно читали эти ссылки? Разве у вас нет ''% 4.3f "'? И почему есть '\ t'? Что это должно делать? Пожалуйста, прочитайте [приличный учебник] (http://docs.oracle.com/javase/tutorial/java/data/numberformat.html). –

+0

Да, я действительно читаю эти ссылки. Я не заметил% 4.3f на первом printf, и это было законно плохо.Это мой первый раз, когда я использовал printf в java, и чтение этих других ссылок не давало мне большого понимания, поскольку я даже не понимал, что в исходном коде есть спецификатор формата. Спасибо, что указали это, хотя это должно исправить. –

+0

Что меня смущает, так это то, что вы сделали это правильно в одном заявлении printf, кроме того, что вы не должны использовать вкладки. –

ответ

0

У вас есть много проблем в этом коде:

  • Использование Printf без спецификаторов формата является основным вопрос. Например, System.out.printf("%3.2\t", r); не имеет смысла. Как Java должна форматировать r, когда вы не даете ему символ, который указывает, какой формат должен быть. У вас должен быть правильный спецификатор после % и номер, здесь f будет работать, имея в виду, что у вас есть номер с плавающей запятой: "%4.3f".
  • \t и \n не делают то, что, по вашему мнению, они должны делать.
    • избегать вкладок, если вы можете использовать printf и вместо этого использовать ширину формата. Вкладки - ненадежные разделители, поскольку они не учитывают ширину строк рядом с ними, в то время как ширины формата делают.
    • использование %n для новой линии в Printf

Самое главное, прочитать decent formatting tutorial для деталей.

+0

Хотя вы правы, что мне нужно было что-то в строках% 3.2f, мне действительно нужны эти \ t и \ n. Это помогает мне легче читать мой формат вывода, спасибо. –

+0

На самом деле, было сказано несколько раз, что я не должен использовать вкладки, возможно, этот учебник поможет мне понять, почему позже, но atm это не так уж важно, он делает то, что мне нужно, чтобы это делать сейчас, и я просто не есть время прочесть что-то подобное прямо сейчас. –