2014-10-30 2 views
1

Я хочу начать с того, что я новичок в этом. Я пытаюсь сделать цикл for, который покажет мне разные 40-тичеловые временные черты, преобразованные в MPH. Проблема заключается в том, что выход это показывается:Изменение выхода `double` внутри для цикла

5.96 40 Time is 13.727882855399633 Miles Per Hour 
6.96 40 Time is 11.755485893416928 Miles Per Hour 
7.96 40 Time is 10.27866605756053 Miles Per Hour 

Я хочу, чтобы показать, как 5,96, 5,97, 5,98 и т.д. вместо 5,96 и 6,96.

Кто-нибудь понимает, что я пытаюсь сделать, а также исправить эту проблему, которую у меня есть?

public class FortyToMPH { 

    public static void main (String args []) { 
     double yards, foot, FeetInMiles, SecondsPerHour,FeetLength; 
     double FortyTime, Minutes, SecondsPerMile, MPH; 
     int counter; 


     counter = 0; 

     for(FortyTime = 4.96; FortyTime <= 7.99; FortyTime++) { 
     yards = 40; // length in yards 
     foot = yards * 3; // convert to feet 
     System.out.println(); 

     FeetInMiles = 5280; // The number of feet in a Mile 
     SecondsPerHour = 3600; 

     FeetLength = FeetInMiles/foot; // You divide the Feet in Miles by the feet conversion of 40 yards 
     System.out.println(); 

     SecondsPerMile = FeetLength * FortyTime; 
     MPH = SecondsPerHour/SecondsPerMile; 
     System.out.println(FortyTime + " 40 Time is " + MPH + " Miles Per Hour "); 

     counter++; 
     // every 10th line, print a blank line 
     if(counter == 10) { 
      System.out.println(); 
      counter = 0; // reset the line counter 


     } 

     } 
    } 
} 
+0

Почему вы не добавляете '0.01' в' FortyTime' вместо '++'? – Maroun

+1

Также обратите внимание на [Соглашения о присвоении имен Java] (http://www.oracle.com/technetwork/java/codeconventions-135099.html) и измените имена переменных. – Maroun

+0

возможно этот http://stackoverflow.com/questions/3971434/for-loop-increment-by-double может помочь – SleepyX667

ответ

1

Здесь я изменил код, который вы дали, чтобы удвоить печать в виде чисел с двумя запятыми (см. Формат% .2f), созданных в цикле while (шаг для цикла определен в переменной DELTA).

public class FortyToMPH 
{ 
    public static void main (String args []) 
    { 
     double yards, foot, feetLength; 
     double fortyTime = 4.96, minutes, secondsPerMile, mph; 
     int counter = 0; 
     /** 
     * Constants. 
     */  
     final double FEET_IN_MILES = 5280; 
     final double SECONDS_PER_HOUR = 3600; 
     final double DELTA = 0.01; 
     final double END  = 7.99; 

     while (fortyTime <= END) 
     { 
      yards = 40; // length in yards 
      foot = yards * 3; // convert to feet 

      feetLength = FEET_IN_MILES/foot; // You divide the Feet in Miles by the feet conversion of 40 yards 

      secondsPerMile = feetLength * fortyTime; 
      mph = SECONDS_PER_HOUR/secondsPerMile; 
      System.out.format("%.2f 40 Time is %.2f Miles Per Hour%n", fortyTime, mph); 

      counter++; 
      // every 10th line, print a blank line 
      if(counter == 10) { 
       System.out.println(); 
       counter = 0; // reset the line counter 
      } 

      fortyTime += DELTA; 
     } 
    } 
} 
+0

Чувак Большое спасибо. Отлично! –

+0

Я еще не узнал о DELTA и пока. В чем разница между двойным и финальным двойным? –

+1

Эта DELTA является постоянной. Это совершенно законно писать без финала. Конечный результат означает, что значение переменной не может измениться после назначения. Константы должны иметь имена в верхнем регистре, см. [Соглашение об именах Java] (http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367). :) – Willmore

3

Проблема заключается в том, что вы используете оператор ++ в вашем для определения контура:

for(FortyTime = 4.96; FortyTime <= 7.99; FortyTime++) { 

Измените цикл на время цикл, который включает в себя линию увеличивающейся FortyTime на 0,01 каждой петлю:

while(FortyTime <= 7.99) { 
    FortyTime += 0.01; 
    // execute the rest of your code here 
} 

MarounMaroun справедливо указал, что использование двойного в качестве счетчика цикла рискует противные с плавающей запятой арифметических ошибок, поэтому я изменил цикл for на цикл while.

Оператор «++» означает «переназначить значение x как x + 1». Он будет давать вам только приращения (или декременты, с --) от 1.

Обратите внимание, что это будет распечатывать сотни строк до их завершения.

+1

Знайте о арифметике с плавающей запятой ! – Maroun

+0

@MarounMaroun Хм, я почесываю голову здесь - просветите меня? Бывают ли случаи, когда добавление сотого к любому числу с точностью до двух цифр приведет к ошибкам округления? – furkle

+0

Да, попробуйте напечатать значения этого цикла: 'for (double i = 0; i <1.0; i + = 0.1)'. – Maroun

0

просто изменить цикл, как это:

for(FortyTime = 4.96; FortyTime <= 7.99; FortyTime=FortyTime+.01) 

и распечатать его как

System.out.println((float)FortyTime + " 40 Time is " + MPH + " Miles Per Hour "); 
0

Вам необходимо внести два изменения:

for(FortyTime = 4.96; FortyTime <= 7.99; FortyTime=FortyTime+0.01) 

Так что FortyTime увеличивается 0,01, а не 1 и

System.out.printf("%.2f 40 Time is %f Miles Per Hour ", FortyTime, MPH); 

Для правильной печати.

2

Я бы порекомендовал вам использовать int в вашем цикле и выполнять все расчеты double с внутри цикла, чтобы избежать проблем с арифметикой с плавающей точкой:

for(int i = 0; i < something; i++) { 
    double fortyTime = 4.96 + i; 
    //... 
} 

Также обратите внимание на Java Naming Conventions и переименовывать переменные.

Чтобы продемонстрировать проблемы арифметики с плавающей точкой, попробуйте этот цикл:

for(double i = 0; i < 1.0; i += 0.1) 
    System.out.println(i); 

Это напечатает

0.0 
0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

И вы не хотите выход, как это в вашей программе.

Смежные вопросы