Як я можу знайти довжину числа?


161

Я хочу отримати довжину числа в JavaScript або jQuery?

Я намагався value.lengthбез успіху, чи потрібно мені спочатку перетворити це на рядок?


3
Так, перетворіть його в рядок. Поняття "довжини" числа має сенс лише з точки зору деякої схеми представлення чисел.
Pointy

Так, вам потрібно перетворити спочатку на рядок, IE (1234) .toString (). Довжина
Осама Барі

Орієнтири для топ-3 відповідей: merithat.net/Benchmarks/ShowResult/92276
Річі Бендалл

Відповіді:


304
var x = 1234567;

x.toString().length;

Цей процес також буде працювати для Float Numberі для Exponential numberтакож.


9
Поставив +1. Якщо це нікому не очевидно, десяткова крапка в поплавках буде зараховуватися в довжину рядка. напр. 2.5.toString (). довжина виходів 3.
dading84

1
@ dading84: я думаю, Math.floor () виправить це: Math.floor (99.5454) .toString (). length === 2
Manfred

7
Це рішення не працюватиме з великою чи малою кількістю, що має більше 20 цифр. напр. 1,2e + 22 toString (). Довжина виходів 7
CherylG

Також зазначити, що це надзвичайно повільно. Я зробив тест на вузол, і виявляється, що це на 1200% повільніше, ніж відповідають Артурс.
Олівер Діксон

1
Це не гарне рішення, наприклад: const val = 0295; const x = val.toString (). довжина; console.log (x) // вихід: 3
karolkarp

82

Гаразд, так багато відповідей, але це чиста математика, просто для розваги або для пам’яті, що математика важлива:

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

Це фактично дає "довжину" числа, навіть якщо воно знаходиться в експоненціальній формі. numтут повинно бути невід'ємне ціле число: якщо воно від'ємне, візьміть його абсолютне значення і відрегулюйте знак згодом.

Оновлення для ES2015

Тепер Math.log10це річ , ви можете просто написати

const len = Math.ceil(Math.log10(num + 1));

1
Я думаю, що ця чиста математика є найбільш ефективною / швидкою.
Noitidart

2
Awesme perf man дякую. Результати, які я отримав, показують, що математичний шлях - це швидкий результат, це результат? ось мій результат: i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak О, це добре. Я бачу, що метод в основному є математичним у будь-якому випадку, але з деякими швидкісними хаками. Він падає a Math.ceilі використовує швидше Math.absзамість цього. Але я, чесно кажучи, не очікував, що підвищення продуктивності в Chrome ... Приємно знати!
MaxArt

3
Ідеально, але дає 0, якщо номер 0 замість 1
StateLess

1
При 1е + 16 і більше це дає 1 менше, тому 10000000000000000 повертає 16 замість 17 і так далі ...
Goty Metal

12

Я використовував цю функціональність у node.js, це моя найшвидша реалізація поки що:

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

Він повинен обробляти додатні та від’ємні цілі числа (також у експоненціальній формі) і повинен повертати довжину цілочисельної частини у поплавках.

Наступне посилання має дати деяке розуміння методу: Weisstein, Eric W. "Довжина числа". Від MathWorld - веб-ресурс Wolfram.

Я вважаю, що деяка побітна операція може замінити Math.abs, але jsperf показує, що Math.abs працює чудово в більшості двигунів js.

Оновлення : Як зазначено в коментарях, це рішення має деякі проблеми :(

Update2 (вирішення) : Я вважаю, що в якийсь момент проблеми з точністю починаються, і Math.log(...)*0.434...просто поводиться несподівано. Однак якщо пристрої Internet Explorer або Mobile не є вашою чашкою чаю, ви можете замінити цю операцію Math.log10функцією. У Node.js я написав швидкий базовий тест з функцією nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;і з Math.log10ним працював, як очікувалося. Зверніть увагу, що Math.log10це не підтримується повсюдно.


Як цікавість, я виконав JsPerf методом nLength проти toString (). Довжина на цьому .... jsperf.com/convert-number-to-string-and-get-length/2
Ізраїль Хавіла

Ха-ха, це в основному рішення, яке я запропонував! Я не мав уявлення, що це може так добре працювати.
MaxArt

2
Вибачте, я щось сказав про те, щоб винайти рішення чи щось подібне? Чому ви не читаєте уважно перед публікацією? Що стосується цього, алгоритм був розкритий ще до того, як Стівен Вольфрам навіть народився, і все одно сторінка, на яку ви пов’язали, не пропонує рішення в Javascript. Я , 9 місяців до тебе.
MaxArt

1
"+1", ймовірно, повинен бути поза дзвінками Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak

1
При 1е + 16 і більше це дає 1 менше, тому 10000000000000000 повертає 16 замість 17 і так далі ...
Goty Metal

11

Для того, щоб взяти довжину, потрібно ввести рядок у рядок

var num = 123;

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

або

alert(num.toString().length);

9

Можна також використовувати рядок шаблону:

const num = 123456
`${num}`.length // 6

це єдина відповідь, яка працює для мене, тому що я рахую число, яке починається з 0.
jessiPP

5

Ну не перетворюючи ціле число в рядок, ви можете зробити фанкі цикл:

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

Демо: http://jsfiddle.net/maniator/G8tQE/


3
@Pointy так, це передбачається ціле число. Навіть якщо ви зробите це рядок, він буде включати .як частину обчислення.
Naftali aka Neal

так, хоча це цікавий філософський питання, чи слід включити крапку в "довжину" :-)
Pointy

4

Спочатку перетворіть його у рядок:

var mynumber = 123;
alert((""+mynumber).length);

Додавання до нього порожнього рядка неявно призведе mynumberдо перетворення в рядок.


1
Не працює з експонентами, такими як 1e + 16, який повертає 5.
Goty Metal

4

Є три способи зробити це.

var num = 123;
alert(num.toString().length);

краща продуктивність (найкраща продуктивність у ie11)

var num = 123;
alert((num + '').length);

Math (найкраща продуктивність у Chrome, firefox, але найповільніша у ie11)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

тут є jspref http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

Вам слід піти на найпростіший (stringLength), читабельність завжди б'є швидкість. Але якщо вам важлива швидкість, ось деякі нижче.

Три різні методи - все з різною швидкістю.

// 34ms
let weissteinLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}

// 350ms
let stringLength = function(n) {
    return n.toString().length;
}

// 58ms
let mathLength = function(n) {
    return Math.ceil(Math.log(n + 1) / Math.LN10);
}

// Simple tests below if you care about performance.

let iterations = 1000000;
let maxSize = 10000;

// ------ Weisstein length.

console.log("Starting weissteinLength length.");
let startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    weissteinLength(Math.random() * maxSize);
}

console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");


// ------- String length slowest.

console.log("Starting string length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    stringLength(Math.random() * maxSize);
}

console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");


// ------- Math length.

console.log("Starting math length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    mathLength(Math.random() * maxSize);
}

3

Мені поставили подібне питання в тесті.

Знайдіть довжину числа без перетворення в рядок

const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]

const numberLength = number => {

  let length = 0
  let n = Math.abs(number)

  do {
    n /=  10
    length++
  } while (n >= 1)

  return length
}

console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]

Негативні цифри були додані, щоб трохи більше ускладнити це, звідси Math.abs ().


2

Я хотів би виправити відповідь @Neal, яка була досить хорошою для цілих чисел, але число 1 поверне довжину 0 в попередньому випадку.

function Longueur(numberlen)
{
    var length = 0, i; //define `i` with `var` as not to clutter the global scope
    numberlen = parseInt(numberlen);
    for(i = numberlen; i >= 1; i)
    {
        ++length;
        i = Math.floor(i/10);
    }
    return length;
}


0

Так, вам потрібно перетворити в рядок, щоб знайти довжину. Наприклад

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.