java - 处理时间加倍的函数存在问题

标签 java

我创建了一个处理 double 的方法,以便将 double 转换为“持续时间”(例如,输入 3.89 将等于 4.29,如 4 分 29 秒)。我的问题是,当我输入任何具有十进制值 0.59 的 double 值时,我的输入会无限循环,这意味着我可以输入无限次,但什么也不会发生。

这是我正在学习的 Java 在线类(class),我的任务是创建一个类似播放列表的程序(非常简单,扫描仪)。

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测试了它),但由于某种原因,它仍然导致循环。我知道这是方法,因为我从构造函数中取出了该方法并且它工作得很好。非常感谢所有能帮助我的人!

最佳答案

作为对代码卡住的原因的猜测,可能是由于在 double 上使用了 %= 运算符。 %(取模)运算符只能用于整数,因为它返回整数除法后的余数。它不适用于 double ,因为您将返回小数而不是整数。

这是您的代码版本,我认为该版本已经过简化和一些批评。

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;
}

作为批评,我有一些建议可以在您前进的过程中改进。首先是使用更具描述性的变量名称。 addTimesInaddTimes 对我来说意义不大。此外,对于像 doubleToDuration 这样的名称,传入 duration 是没有意义的,因为这就是您将返回的内容。

其次,就我个人而言,我不喜欢使用 while(true) 循环。这只是个人风格,但在您有 ifelse 以及 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 循环。如果只是为了转换,我不知道你在哪里需要它。

第一行对我来说也没有意义。我认为需要这样做的唯一原因是,如果您传递的时间精度超过小数点后两位。也许在进入函数之前进行某种形式的输入检查。

此函数应该只运行转换,它不应该负责清理输入、计数到 100 以及转换。

如果这些内容看起来过于严酷,我们深表歉意。祝你在类(class)中一切顺利!

关于java - 处理时间加倍的函数存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56695258/

相关文章:

具有不同方法参数的 Java 子类

java - 无法访问 TransactionManager 或 UserTransaction 来进行物理事务委托(delegate)

java - JVM 总是会创建 Object 类的实例吗

java - 在java中解析html以提取信息

java - 在 Java 中声明变量之前赋予另一个类变量值

java - 从远程 git 存储库获取单个文件

java - 具有动态构造函数值的spring bean

java - 基于 Web 还是基于 PC 的过程控制应用程序?

javascript - 在 Android 数字上运行的 Java web 应用程序

java - 如何使用java和jsoup解析HTML文本和链接