错误的“世纪从年”

时间:2019-05-07 20:31:14

标签: javascript

目标是在给定年份重返世纪。

我知道已经发布了一些解决方案,但是我很难查看我的代码在哪里失败。

此代码在哪一年弄错了本世纪?

输入为1 <= x <= 2005

function centuryFromYear(year) {

    if (year % 100 > 0){
        if (year % 100 > 50) {
            return Math.round(year / 100);
        } else {
            return (Math.round((year / 100)) +1);
        }
    } else {
        return Math.round((year / 100)); 
    } 
}

2 个答案:

答案 0 :(得分:1)

这是正确的代码:

if (year % 100 > 0){
    if (year % 100 >= 50) {
        return Math.round(year / 100);
    } else {
        return (Math.round((year / 100)) +1);
    }
} else {
    return Math.round((year / 100)+1); 
} 

您忘记在第一个if循环的else中添加(year / 100)+1,这就是为什么if在2000、1900、1800等情况下失败的原因。

答案 1 :(得分:1)

正如我在上面的评论中指出的那样,问题出在JavaScript rounds numbers的方式上。

  

如果参数的小数部分大于0.5,则   参数将四舍五入为具有更高整数的整数   值。如果小于0.5,则将参数舍入为整数   具有较低的绝对值。如果小数部分正好   0.5,则将参数沿+∞方向四舍五入到下一个整数。 请注意,这与许多语言的round()函数不同,后者通常将这种情况舍入为零附近的下一个整数,   而是在负数的情况下给出不同的结果   精确到0.5的小数部分。

您可以在此处看到问题:

function centuryFromYear(year) {
  if (year % 100 > 0) {
    if (year % 100 > 50) {
      return Math.round(year / 100);
    } else {
      return (Math.round((year / 100)) + 1);
    }
  } else {
    return Math.round((year / 100));
  }
}

for (let i = 1; i <= 2005; i++) {
  console.log(i, centuryFromYear(i))
}

每当您遇到以50结尾的年份时,舍入问题就会出现,并在Math.round((year / 100)) + 1达到Math.round(year / 100)时进行舍入。一个简单的解决方案是将if (year % 100 > 50)更改为if (year % 100 >= 50)

function centuryFromYear(year) {
  if (year % 100 > 0) {
    if (year % 100 >= 50) {
      return Math.round(year / 100);
    } else {
      return (Math.round((year / 100)) + 1);
    }
  } else {
    return Math.round((year / 100));
  }
}

for (let i = 1; i <= 2005; i++) {
  console.log(i, centuryFromYear(i))
}