使用 JavaScript 获取位数

2022-08-30 02:05:37

正如我的帖子标题所暗示的那样,我想知道有多少位数。例如:如果我的函数应该返回 .目前,它看起来像这样:var numbernumber = 15;2

function getlength(number) {
  return number.toString().length();
}

但是Safari说它由于以下原因而无法正常工作:TypeError

'2' is not a function (evaluating 'number.toString().length()')

如您所见,实际上是正确的解决方案。但为什么会这样呢?'2'not a function


答案 1

length是一个属性,而不是一个方法。你不能调用它,因此你不需要括号:()

function getlength(number) {
    return number.toString().length;
}

更新:如注释中所述,上述示例不适用于浮点数。为了使其正常工作,我们可以删除带有 的句点,或者使用正则表达式计算数字:。String(number).replace('.', '').lengthString(number).match(/\d/g).length

就速度而言,在给定数字中获取位数的最快方法是在数学上做到这一点。对于正整数,有一个很棒的算法:log10

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

对于所有类型的整数(包括负整数),@Mwr247都有一个出色的优化解决方案,但要小心使用 ,因为许多旧版浏览器都不支持它。因此,替换为将解决兼容性问题。Math.log10Math.log10(x)Math.log(x) * Math.LOG10E

由于众所周知的浮点数学行为,为十进制数创建快速的数学解决方案并不容易,因此转换为字符串的方法将更容易和万无一失。正如@streetlogics快速转换可以通过简单的数字到字符串串联来完成,从而导致替换解决方案转换为:

var length = (number + '').replace('.', '').length;  // for floats

答案 2

这是一个数学答案(也适用于负数):

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

从本质上讲,我们从获取输入的绝对值开始,以允许负值正常工作。然后,我们运行 through log10 操作,向我们提供输入的 10 的幂(如果您在另一个基数中工作,则使用该基数的对数),即位数。然后,我们将输出设置为仅获取其中的整数部分。最后,我们使用max函数固定十进制值(0和1之间的任何小数值只返回1,而不是负数),并将1添加到最终输出中以获得计数。

以上假设(基于您的示例输入)您希望以整数计算位数(因此12345 = 5,因此12345.678 = 5)。如果要计算值中的总位数(因此12345.678 = 8),请在上述任一函数中的“return”之前添加此数字:

x = Number(String(x).replace(/[^0-9]/g, ''));

* 请注意,JavaScript 中的按位运算仅适用于 32 位值(因此最大值为 2,147,483,647)。因此,如果您期望数字大于此值,请不要使用按位版本,否则它根本行不通。