【问题标题】:Averages not calculating correctly平均值计算不正确
【发布时间】:2018-07-17 18:37:35
【问题描述】:

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

现在我正在计算最近 5 次的平均值(以毫秒为单位),然后将该数字格式化为更大的时间单位并将其显示到表格中,但我遇到了一个数学问题,我可以解决不了。

假设我的时间数组有五个条目。

[10069, 14062, 15060, 13033, 13094]

所以这五次的平均值是 13,396(所有五次加起来减去最高和最低再除以 3)。但是,当转换为时间字符串时,这些时间如下:

[10.69, 14.62, 15.60, 13.33, 13.94]

如果你计算这五个数字的平均值和上面一样,你得到的平均值是 13.96,而它应该是 13.396,然后四舍五入到 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;
    }
}

【问题讨论】:

  • 很难说,因为你没有发布任何代码
  • 你从哪里得到13.396
  • 第二个数组应该是 [10.069 , 14.062 , 15.060 , 13.033 , 13.094] ,那么平均值就是13.396
  • 这并不能解释 1309413.94 的关系。似乎更像是一个转换问题。根据minimal reproducible example向我们展示您的代码
  • 正如阿里所说,您在转换为小数方面做得不好。 1006910.69 没有有意义的关系。那么“时间字符串”是什么意思?

标签: javascript arrays time average


【解决方案1】:

正如已经评论的那样,您在 ms 中的那些数字应该是: [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 毫秒,0.77 是 770 毫秒。因此,您需要在返回行之前添加ms=(ms+'00').slice(0,3)

我相信综合起来,这些应该可以解决问题(尽管我可能遗漏了一些东西)。

【讨论】:

  • 我假设 1:24.56 的意思是“0.56 秒”而不是“56 毫秒”。在知道它已在相关帖子中得到回答(可能更好)之前,我也发布了这个。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多