【发布时间】: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
-
这并不能解释
13094与13.94的关系。似乎更像是一个转换问题。根据minimal reproducible example向我们展示您的代码 -
正如阿里所说,您在转换为小数方面做得不好。
10069和10.69没有有意义的关系。那么“时间字符串”是什么意思?
标签: javascript arrays time average