这是一个数学答案(也适用于负数):
function numDigits(x) {
return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}
以及上述的优化版本(更有效的按位运算):*
function numDigits(x) {
return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}
本质上,我们首先获取输入的绝对值,以允许负值正常工作。然后我们运行 log10 运算,得到输入的 10 的幂(如果您在另一个底数中工作,您将使用该底数的对数),即位数。然后我们将输出降低到只获取整数部分。最后,我们使用 max 函数来固定十进制值(0 到 1 之间的任何小数值都只返回 1,而不是负数),并将最终输出加 1 以获取计数。
以上假设(基于您的示例输入)您希望计算整数的位数(因此 12345 = 5,因此 12345.678 = 5 也是如此)。如果您想计算值中的总位数(因此 12345.678 = 8),请在上述任一函数的“返回”之前添加:
x = Number(String(x).replace(/[^0-9]/g, ''));
* 请注意,JavaScript 中的按位运算仅适用于 32 位值(因此最大值为 2,147,483,647)。因此,如果您期望数字大于该数字,请不要使用按位版本,否则它根本行不通。