我有一个计时器应用程序,可以将以毫秒为单位的时间保存到数组中,然后将其格式化为较大的时间单位,并在表格中显示。
现在,我正在计算最近5次的平均值(以毫秒为单位),然后将该数字格式化为较大的时间单位,并同时将其显示在表格中,但是我遇到了一个数学问题,我可以解决。
说我的时间数组有五个条目。
[10069, 14062, 15060, 13033, 13094]
因此,这五次的平均值为13,396(将所有五次相加减去最高和最低值并除以3)。但是,当转换为时间字符串时,这些时间如下:
[10.69, 14.62, 15.60, 13.33, 13.94]
如果您计算这五个数字的平均值与上面相同,则当平均值应为13.396时,平均值为13.96,将四舍五入为13.40。
有人知道我在这里想念什么吗?
下面是函数的一部分,该过程以毫秒为单位,并返回以较大时间单位格式化的字符串。因此,传入1077应该返回1.07,但相反返回1.77。
milliseconds = parseInt((duration % 100)),
seconds = parseInt((duration / 1000) % 60),
minutes = parseInt((duration / (1000 * 60)) % 60),
hours = parseInt((duration / (1000 * 60 * 60)) % 24);
下面是timer.js文件中的timeFormatter,它占用了从启动和停止计时器之间经过的毫秒数,并将它们显示为字符串。我认为这是正在做的事,但很难说。当计时器读取1.77时,进入数组的数字应为1077,应为1770。
function timeFormatter(timeInMilliseconds) {
var time = new Date(timeInMilliseconds);
var minutes = time.getMinutes().toString();
var seconds = time.getSeconds().toString();
var milliseconds = Math.floor(time.getMilliseconds().toString() / 10);
if (milliseconds < 10) {
milliseconds = '0' + milliseconds;
}
if (minutes < 1) {
return seconds + '.' + milliseconds;
} else {
if (seconds < 10) {
return minutes + ':0' + seconds + '.' + milliseconds;
} else {
return minutes + ':' + seconds + '.' + milliseconds;
}
}
}
编辑:实际上,我认为问题出在toMS函数中,该函数接受我发送给它的格式化时间字符串(10.77)并返回毫秒。如果我输入10.77,它应该返回1770时返回1077,对吧?
function toMS(str) {
if(str.includes(":")) {
const [mins, secms] = str.split(":");
const [sec, ms] = secms.split(".");
return ((+mins * 60) + +sec) * 1000 + +ms;
} else {
const [sec, ms] = str.split(".");
return (+sec) * 1000 + +ms;
}
}
答案 0 :(得分:0)
因此,如前所述,您以毫秒为单位的数字应为:
[10.069,14.062,15.060,13.033,13.094]以秒为单位,如果对它们执行您的(sum-min-max)/ 3,您将得到13.39633333,该值转换回秒与您的原始计算结果一致(13396为最接近的整数)。如您所知,这是一个转换问题。
您的行milliseconds = parseInt((duration % 100)),
似乎应该是milliseconds = parseInt((duration % 1000)),
,在1077的示例中,这并不重要,但在1977年,确实如此(那是一整秒,共977毫秒)。那里的其他部分看起来正确。
在格式化程序中,if (milliseconds < 10) {
milliseconds = '0' + milliseconds;
}
应该为if (milliseconds < 10) {
milliseconds = '00' + milliseconds;
}//7 ms=.007 s
else if (milliseconds < 100) {
milliseconds = '0' + milliseconds;//97 ms =.097 s
}
最后,在您的toMS函数中,返回之前,您需要处理ms为1或2个字符长数字的可能性(为简单起见,我假设所有时间都被截断或四舍五入,并且不能为4位数字数字-根据您对上述地板的使用,这似乎是合理的)。 .007实际上是7毫秒,但是.7是700毫秒,.77是770毫秒。因此,您需要在返回行之前添加ms=(ms+'00').slice(0,3)
。
我相信,这些内容应该可以解决问题(尽管我可能会漏掉一些东西)。