为什么毫秒转换错误?

时间:2018-07-17 23:20:31

标签: javascript time

我有一个计时器应用程序,它计算经过的时间(以毫秒为单位),将其转换为格式化的字符串,然后显示出来。在其他地方,我有一个函数可以将相同的字符串转换为毫秒,以便执行其他一些数学运算。我知道,这似乎违反直觉,但大多数情况下都是有效的。

无论如何,此函数需要一个字符串,如14.55(14秒和约550毫秒),并以毫秒为单位返回时间,但操作不正确。

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;
  }
}

如果我输入类似10.77的值,它将返回10077,而不是应有的10770。怎么了?

3 个答案:

答案 0 :(得分:3)

为什么不使用parseFloat?

function toMS(str) {
  if(str.includes(":")) {
    const [mins, secms] = str.split(":");
    const sec = parseFloat(secms);
    return ((+mins * 60) + sec) * 1000;
  } else {
    return parseFloat(str) * 1000;
  }
}

答案 1 :(得分:0)

0.1秒等于100毫秒,而不是1毫秒。请记住,0.1秒也可以写为1/10秒1/10 * 1000ms = 100ms

这意味着您必须将小数部分乘以100才能获得正确的结果。

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 * 100;
  }
}

注意:您不需要+来转换变量,因为*足以将其强制转换为number

您还可以通过以下方式应用DRY原理:

function toMS(str) {
  let mins = 0;
  if(str.includes(":")) {
    [mins, str] = str.split(":");
  } 
  const [sec, ms] = str.split(".");
  return mins * 60000 + sec * 1000 + ms * 100;
}

答案 2 :(得分:0)

如果您担心使用parseFloat解决方案舍入错误,那么这里是一个纯字符串实现:

ms = +(ms.concat("00").substring(0,3));

那么,我们在做什么?

  1. 在毫秒字符串中添加“ 0”。我们用2个零填充以适应以下情况:

    a。超过3位数字-在这种情况下,所有填充的零将在以后被忽略

    b。正好有3位数字-所有填充的零将在以后被忽略

    c。正好有2位数字-多余的零将被忽略

    d。正好有1位数字-都需要两个零

    e。完全没有数字-后面的两个零都将转换为0

  2. 我们仅使用前3位数字。这将自动忽略任何额外零的情况,以及是否意外以比所需精度更高的精度指定了ms(例如,如果有人输入1.1234)

  3. 我们使用一元+运算符

  4. 转换为数字