如何计算给定数字的位数?

4
我希望用户输入一个数字,并打印出该数字的位数。 我知道可以使用"length",但我的作业要求使用"while"循环。 这是我的代码:

var num;
var count = 0;

num = prompt('Enter number: ');

function counter(x, y) {
  while (x > 0) {
    y++;
    x /= 10;
  }
  return y;
}

var result = counter(num, count);

console.log(result);

当我输入数字3456(例子),程序返回了数字328。我希望程序能够把数字4输出。


3
将数字转换为字符串并访问其.length属性。 - Kunal Mukherjee
count 变量移动并使其成为 let 块作用域。 - Kunal Mukherjee
2
0 应该返回 0 还是 1 - nick zoum
1
@EricWu 当你学习一种乐器时,老师会告诉你要练习音阶和琶音,不是因为它们听起来很悦耳,而是因为它们可以教你技巧。编程练习通常也是如此:简化和限制,以便让你学习算法和程序设计的思考方式。通常情况下,会有一个完整的“现在不使用这个内置功能再做一遍”的序列。 - IMSoP
1
让我们也提一下不使用循环和字符串方式解决这个问题的数学方法。即取10为底的对数的整数部分加上1。 Math.floor(Math.log10(Math.abs(num))) + 1 取绝对值可使其适用于负数,0是一个特殊情况。 - radulfr
显示剩余4条评论
6个回答

3
这行代码:
x /= 10;

应该改为:

x = Math.floor(x / 10);

这个逻辑假设进行整数除法:1234应该变成123、12、1和0。由于JavaScript没有内置的整数除法,因此需要使用Math.floor来模拟它。以下是一些修复后的完整示例:

function countDigits(num) {
  var count = 0;
  while (num > 0) {
    num = Math.floor(num / 10);
    count++;
  }
  return count;
}

var num;
do {
  num = Number(prompt("Enter number:"));
} while (Number.isNaN(num));
num = Math.abs(num); // just in case you want to handle -ve numbers
var result = countDigits(num);
console.log(result);


1
问题在于除法运算最终会将 x 转换为浮点数,结果可能会像这样:
x / 10 === 0.1;
x / 10 === 0.01;
x / 10 === 0.001;
....

如果你总是将除法的结果解析(四舍五入)为整数,你将得到预期的结果。

var num;
var count = 0;

num = prompt('Enter number: ');

function counter(x, y) {
  while (x > 0) {
    y++;
    x = parseInt(x / 10);
  }
  return y;
}

var result = counter(num, count);

console.log(result);


1
在数字上使用 parseInt 是错误的... "parse" 的意思是从字符串中解析出某些东西。 - Salman A

1

首先,您应该将输入转换为数字,最好使用Number函数(使用一元+具有相同的效果)。

其次,像5 / 10这样的除法将返回0.5,这比0大。您应该检查数字是否大于或等于1

function counter(num) {
  num = Math.abs(num) / 10;
  var count = 1;  
  while (num >= 1) {
    count++;
    num /= 10;
  }
  return count;
}

console.log(counter(+prompt('Enter number: ')));

您也可以使用 do while 循环,避免在循环外进行额外的除法运算。

1
你可以通过将十进制计数的幂来检查一个数字。

function counter(value) {
    var decimals = 0;
    do {
        decimals++;
    } while (value >= 10 ** decimals)
    return decimals;
}

console.log(counter(0));
console.log(counter(1));
console.log(counter(7));
console.log(counter(42));
console.log(counter(999));
console.log(counter(1000));
console.log(counter(1001));


1
正如其他人指出的那样,y不需要成为参数,它可以是一个局部变量。但这不是你的问题;让我们在你的循环中添加一些额外的日志记录:
function counter(x) {
  let y=0;
  while (x > 0) {
    console.log("x=" + x + ", y=" + y);
    y++;
    x /= 10;
  }
  return y;
}
counter(3456);

输出结果如下所示:
x=3456, y=0
x=345.6, y=1
x=34.56, y=2
x=3.4560000000000004, y=3
x=0.3456, y=4
x=0.03456, y=5
...

你希望循环在0.3456处停止,但这仍然大于0。(这个错误实际上给了你一个机会学到额外的东西:你能解释为什么循环最终会结束吗?) 希望这能给你足够的提示完成作业任务 - 记住,调试是编程中极其重要的一部分。

0

请不要使用循环来测量整数的长度...

使用数学代替!对于您来说,对数将做得更好。

function numberLength(number) {
    return Math.floor(Math.log10(Math.abs(number))) + 1
}

console.log(numberLength(YOUR_NUMBER));

当输入为0时,此代码返回NaN。我认为这取决于您的哲学观点,0应该有多长,所以我将不处理该情况。


1
这是一个与JavaScript相关的作业任务,要求使用循环,而不是Math函数。 - Salman A
@Salman A 我知道,但是当其他人在做不同的作业时,他们可能会阅读这个问题,搜索引擎可能会将他们引导到这里。所以他们应该能够在这里找到更好的解决方案。 :-) - Firzen
1
最好使用 Math.floor 而不是 parseInt 来处理数字参数。 - georg
@georg 谢谢!实际上我对JavaScript一窍不通,哈哈:D - Firzen
这是一道编程练习题。如果你认为问题需要更明确,那么可以提出修改建议,但由于问题已经说了“我知道我可以使用 'length',但我的作业要求使用 'while' 循环”,因此这只是对问题的错误回答。 - IMSoP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接