gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:27:24 26 4
gpt4 key购买 nike

我创建了一个处理 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com