我怎样才能找到一个数字的长度?

IT技术 javascript jquery
2021-02-20 12:17:31

我想在 JavaScript 或 jQuery 中获取数字的长度?

我试过value.length没有任何成功,我需要先将它转换为字符串吗?

6个回答
var x = 1234567;

x.toString().length;

这个过程也将努力为Float NumberExponential number也。

@dading84:我猜 Math.floor() 会解决这个问题:Math.floor(99.5454).toString().length === 2
2021-04-29 12:17:31
还要注意这是非常慢的。我在 node 中做了一个测试,结果发现它比 Arturs 的回答慢 1200% 以上。
2021-04-30 12:17:31
这不是一个好的解决方案,例如:const val = 0295; const x = val.toString().length; console.log(x) // 输出为:3
2021-05-01 12:17:31
+1 了。如果对任何人都不明显,则浮点数中的小数点将计入字符串长度。例如 2.5.toString().length 输出 3。
2021-05-05 12:17:31
此解决方案不适用于超过 20 位数的大数字或小数字。例如。1.2e+22 toString().length 输出 7
2021-05-20 12:17:31

好吧,这么多答案,但这是一个纯粹的数学问题,只是为了好玩或记住数学很重要:

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

这实际上给出了数字的“长度”,即使它是指数形式的。num在这里应该是一个非负整数:如果它是负数,则取其绝对值并在之后调整符号。

ES2015 更新

现在这Math.log10是一件事,你可以简单地写

const len = Math.ceil(Math.log10(num + 1));
在 1e+16 或更多时,它会减少 1,所以 10000000000000000 返回 16 而不是 17 等等......
2021-04-24 12:17:31
@HubertGrzeskowiak 哦,太好了。我认为该方法基本上是一种数学方法,但有一些速度技巧。它丢弃 aMath.ceil并使用更快的Math.abs代替。但老实说,我没想到 Chrome 的性能会提高……很高兴知道!
2021-05-06 12:17:31
完美,但如果您的数字是 0 而不是 1,则给出 0
2021-05-09 12:17:31
我认为这个纯数学是最有效/最快的。
2021-05-12 12:17:31
Awesme perf man 谢谢。我得到的结果表明数学方法很快,这是你得到的结果吗?这是我的结果:i.imgur.com/9BKxyd3.png
2021-05-19 12:17:31

也可以使用模板字符串:

const num = 123456
`${num}`.length // 6
这是唯一对我有用的答案,因为我数了一个以 0 开头的数字。
2021-04-27 12:17:31

你必须把数字串起来才能取长度

var num = 123;

alert((num + "").length);

或者

alert(num.toString().length);
由于 exp,这在数字很长的情况下会失败。符号
2021-04-25 12:17:31

我一直在 node.js 中使用这个功能,这是我迄今为止最快的实现:

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

它应该处理正整数和负整数(也是指数形式),并且应该以浮点数形式返回整数部分的长度。

以下参考资料应提供对该方法的一些见解: Weisstein, Eric W.“Number Length”。来自 MathWorld--Wolfram Web 资源。

我相信一些按位运算可以代替 Math.abs,但是 jsperf 表明 Math.abs 在大多数 js 引擎中都可以正常工作。

更新:如评论中所述,此解决方案存在一些问题:(

Update2(解决方法):我相信在某些时候精度问题Math.log(...)*0.434...会出现并且只是表现出意外。但是,如果 Internet Explorer 或移动设备不是您的菜,您可以用该Math.log10功能替换此操作在 Node.js 中,我使用该函数编写了一个快速的基本测试,nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;并且Math.log10它按预期工作。请注意,Math.log10并非普遍支持。

在 1e+16 或更多时,它会减少 1,所以 10000000000000000 返回 16 而不是 17 等等......
2021-04-30 12:17:31
对不起,我有没有说过我发明了解决方案或类似的东西?发帖前为什么不仔细阅读?就此而言,算法在 Steven Wolfram 出生之前就已被发现,无论如何,您链接的页面并没有在 Javascript 中提供解决方案。做到了,比你早 9 个月。
2021-05-01 12:17:31
哈哈,这基本上就是我提供的解决方案!我不知道它可以表现得如此出色。
2021-05-11 12:17:31
出于好奇,我已经使用 nLength 方法与 toString().length 对此进行了 JsPerf.... jsperf.com/convert-number-to-string-and-get-length/2
2021-05-19 12:17:31
“+1”应该可能在 Math.abs 调用之外: Math.log(Math.abs(n) + 1)...
2021-05-21 12:17:31