Проблема с функцией, которая удваивается во времени - PullRequest
0 голосов
/ 21 июня 2019

Я создал метод, который обрабатывал двойное число, чтобы оно превращало двойное в «длительность» (например, вход 3,89 будет равен 4,29, например, 4 минуты и 29 секунд).Моя проблема в том, что, когда я вхожу в любой дубль с десятичным значением .59, мой ввод становится бесконечно зацикленным, то есть я могу вводить бесконечное количество раз, и ничего не произойдет.

Это для онлайн-курса наЯ использую Java, мне было поручено создать программу, похожую на список воспроизведения (очень простая, сканеры).

Song newSong = new Song(songName, scannerDouble);
public Song(String title, double duration) {
    this.title = title;
    this.duration = doubleToDuration(duration);
}


    private static double doubleToDuration(double duration) {
        duration = Math.round(duration * 100.0) / 100.0;

        double countTillHundred = 0;
        for(@SuppressWarnings("unused")
        double i = .01; countTillHundred + (Math.round((duration % 1) * 100.0) / 100.0) < 1; i+=.01) {
            countTillHundred+=.01;
        }
        double durationDecimal = 1 - (Math.round(countTillHundred * 100.0) / 100.0);

        while(true) {
            if(durationDecimal > .59) {
                double addTimesIn = Math.floor(durationDecimal / .60);
                double addTime = durationDecimal %= .60;
                duration = Math.floor(duration / 1) + addTimesIn + addTime;
            } else {
                break;
            }
        }
        return duration;
    }

Так что результат метода на самом деле правильный (я тестировалэто с sysout's), но по какой-то причине это все еще вызывает цикл.И я знаю, что это метод, потому что я взял метод из конструктора, и он работал нормально.Большое спасибо всем, кто может мне помочь!

1 Ответ

2 голосов
/ 21 июня 2019

В качестве предположения, почему ваш код застревает, это может быть связано с тем, что оператор% = используется для двойных чисел. Оператор% (модуль) может использоваться только для целых чисел, поскольку он возвращает остаток после целочисленного деления. Он не работает с двойными числами, потому что вы получили бы десятичное число вместо целого числа.

Вот версия вашего кода, которую я считаю упрощенной, и некоторые критические замечания.

double convertToDuration(double time) // using time instead of duration, because it's not the duration yet
{
  double minutes = Math.floor(time); // returns the part in front of the decimal
  double seconds = time - minutes; // returns the decimal

  while (seconds > .59) 
  {
    minutes += 1;
    seconds -= .60;
  }

  return minutes + seconds;
}

Что касается критики, у меня есть пара предложений, которые можно улучшить по мере продвижения вперед. Во-первых, использовать более описательные имена переменных. addTimesIn и addTimes ничего не значат для меня. Кроме того, с именем, подобным doubleToDuration, не имеет смысла вводить duration, поскольку это то, что звучит, вы будете возвращаться.

Во-вторых, лично я не люблю использовать петли while(true). Это просто личный стиль, но в вашем случае, когда у вас есть if и else с оператором break;, имеет смысл использовать определенное условие внутри цикла while.

// good
while (seconds > .59) 
{
  minutes += 1;
  seconds -= .60;
}

// not as good
while(true)
{
  if(seconds > .59)
  {
    minutes += 1;
    seconds -= .60;
  }
  else
  {
    break;
  }
}

Я знаю, что не знаю проблемы в явном виде, но я не знаю, почему у вас есть countTillHundred и эта неуклюжая петля for. Если это только для обращения, я не понимаю, где вам это понадобится.

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

Эта функция должна просто запускать преобразования, она также не должна отвечать за очистку входных данных, считая до 100, и преобразование.

Извините, если что-то показалось слишком резким. Удачи в вашем курсе!

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