平均值计算不正确

时间:2018-07-17 18:37:36

标签: javascript arrays time average

我有一个计时器应用程序,可以将以毫秒为单位的时间保存到数组中,然后将其格式化为较大的时间单位,并在表格中显示。

现在,我正在计算最近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;
    }
}

1 个答案:

答案 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)

我相信,这些内容应该可以解决问题(尽管我可能会漏掉一些东西)。