目标是在给定年份重返世纪。
我知道已经发布了一些解决方案,但是我很难查看我的代码在哪里失败。
此代码在哪一年弄错了本世纪?
输入为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));
}
}
答案 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))
}