Jak mogę znaleźć długość liczby?


161

Chcę uzyskać długość liczby w JavaScript lub jQuery?

Próbowałem value.lengthbez powodzenia, czy muszę najpierw przekonwertować to na ciąg?


3
Tak, zamień go na ciąg. Pojęcie „długości” liczby ma znaczenie tylko w odniesieniu do pewnego schematu reprezentacji liczb.
— Pointy

Tak, musisz najpierw przekonwertować na ciąg, IE (1234) .toString (). Length
— Osama Bari

Benchmarki dla 3 najpopularniejszych odpowiedzi: measurethat.net/Benchmarks/ShowResult/92276
— Richie Bendall

Odpowiedzi:


304
var x = 1234567;

x.toString().length;

Ten proces będzie również działał dla Float Numberi dla Exponential numberrównież.


9
+1 od. W przypadku, gdy nie jest to dla nikogo oczywiste, przecinek dziesiętny w liczbach zmiennoprzecinkowych zostanie policzony do długości łańcucha. np. 2.5.toString (). długość danych wyjściowych 3.
— dading84

1
@ dading84: domyślam się, że Math.floor () naprawiłoby to: Math.floor (99.5454) .toString (). length === 2
— Manfred

7
To rozwiązanie nie zadziała w przypadku dużej liczby lub małej liczby, która ma więcej niż 20 cyfr. na przykład. 1.2e + 22 toString (). Długość wyjść 7
— CherylG

Należy również zauważyć, że jest to bardzo powolne. Zrobiłem test w węźle i okazuje się, że jest o ponad 1200% wolniejszy niż odpowiedź Artura.
— Oliver Dixon

1
Nie jest to dobre rozwiązanie, na przykład: const val = 0295; const x = val.toString (). length; console.log (x) // wyjście to: 3
— karolkarp

82

Ok, tak wiele odpowiedzi, ale to jest czysta matematyka, tylko dla zabawy lub dla przypomnienia sobie, że matematyka jest ważna:

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

To faktycznie daje „długość” liczby, nawet jeśli ma ona postać wykładniczą. numma być tutaj nieujemną liczbą całkowitą: jeśli jest ujemna, weź jego wartość bezwzględną, a następnie dostosuj znak.

Aktualizacja dla ES2015

Teraz Math.log10to rzecz , możesz po prostu napisać

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

1
Myślę, że ta czysta matematyka jest najbardziej wydajna / najszybsza.
— Noitidart

2
Awesme perf man, dzięki. Wyniki, które otrzymałem, pokazują, że matematyka jest szybka. Czy to jest wynik, który otrzymałeś? Oto mój wynik: i.imgur.com/9BKxyd3.png
— Noitidart

1
@HubertGrzeskowiak Och, to miło. Widzę, że ta metoda jest w zasadzie metodą matematyczną, ale z niektórymi hackami prędkości. Upuszcza Math.ceili Math.abszamiast tego używa szybszego . Ale szczerze mówiąc, nie spodziewałem się takiego wzrostu wydajności w Chrome ... Dobrze wiedzieć!
— MaxArt,

3
Idealnie, ale daje 0, jeśli liczba wynosi 0 zamiast 1
— StateLess

1
Przy 1e + 16 lub więcej daje 1 mniej, więc 10000000000000000 zwraca 16 zamiast 17 i tak dalej ...
— Goty Metal

12

Korzystałem z tej funkcjonalności w node.js, to jest moja najszybsza jak dotąd implementacja:

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

Powinien obsługiwać dodatnie i ujemne liczby całkowite (również w postaci wykładniczej) i powinien zwracać długość części całkowitej w liczbach zmiennoprzecinkowych.

Poniższe odniesienie powinno dostarczyć pewnego wglądu w metodę: Weisstein, Eric W. „Długość liczby”. Z MathWorld - Zasób sieciowy Wolfram.

Uważam, że jakaś operacja bitowa może zastąpić Math.abs, ale jsperf pokazuje, że Math.abs działa dobrze w większości silników js.

Aktualizacja : jak zauważono w komentarzach, to rozwiązanie ma pewne problemy :(

Aktualizacja2 (obejście) : Uważam, że w pewnym momencie pojawiają się problemy z precyzją i po Math.log(...)*0.434...prostu zachowuje się nieoczekiwanie. Jeśli jednak Internet Explorer lub urządzenia mobilne nie są twoją filiżanką herbaty, możesz zastąpić tę operację Math.log10funkcją. W Node.js napisałem szybki podstawowy test z funkcją nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;i Math.log10działał zgodnie z oczekiwaniami. Należy pamiętać, że Math.log10nie jest to powszechnie obsługiwane.


Jako ciekawostka wykonałem JsPerf metodą nLength w porównaniu z toString (). Length na tym .... jsperf.com/convert-number-to-string-and-get-length/2
— Havilah

Haha, to w zasadzie rozwiązanie, które dostarczyłem! Nie miałem pojęcia, że ​​może tak dobrze działać.
— MaxArt

2
Przepraszam, czy powiedziałem coś o tym, że wymyślałem rozwiązanie, czy coś takiego? Dlaczego nie przeczytasz uważnie przed wysłaniem? A propos, algorytm został odkryty na długo przed narodzinami Stevena Wolframa, a poza tym strona, do której się odnosiłeś, nie zapewnia rozwiązania w Javascript. Zrobiłem to 9 miesięcy przed tobą.
— MaxArt

1
"+1" prawdopodobnie powinno znajdować się poza wywołaniem Math.abs: Math.log (Math.abs (n) + 1) ...
— Hubert Grzeskowiak

1
Przy 1e + 16 lub więcej daje 1 mniej, więc 10000000000000000 zwraca 16 zamiast 17 i tak dalej ...
— Goty Metal

11

Aby uzyskać długość, musisz przekształcić liczbę w ciąg

var num = 123;

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

lub

alert(num.toString().length);

9

Można również użyć ciągu szablonu:

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

to jedyna odpowiedź, która mi
— pasuje,

5

Cóż, bez zamiany liczby całkowitej na łańcuch, możesz stworzyć funkową pętlę:

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

alert(length);​

Demo: http://jsfiddle.net/maniator/G8tQE/


3
@Pointy tak, to zakłada liczbę całkowitą. Nawet jeśli utworzysz ciąg znaków, uwzględni on .jako część obliczeń.
— Naftali aka Neal

tak, chociaż jest to interesujące pytanie filozoficzne, czy kropka powinna być uwzględniona w "długości" :-)
— Pointy

4

Najpierw przekonwertuj go na ciąg:

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

Dodanie do niego pustego ciągu niejawnie spowoduje mynumberprzekształcenie się w łańcuch.


1
Nie działa z wykładnikami, takimi jak 1e + 16, które zwracają 5.
— Goty Metal

4

Można to zrobić na trzy sposoby.

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

lepsza wydajność (najlepsza wydajność w ie11)

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

Matematyka (najlepsza wydajność w Chrome, Firefox, ale najwolniejsza w IE11)

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

jest tutaj jspref http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

Powinieneś wybrać najprostszy (stringLength), czytelność zawsze przewyższa szybkość. Ale jeśli zależy Ci na szybkości, poniżej znajdziesz kilka.

Trzy różne metody z różną szybkością.

// 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

W teście zadano mi podobne pytanie.

Znajdź długość liczby bez konwersji na ciąg

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 ]

Liczby ujemne zostały dodane, aby trochę bardziej to skomplikować, stąd Math.abs ().


2

Chciałbym poprawić odpowiedź @Neal, która była całkiem dobra dla liczb całkowitych, ale liczba 1 zwróciłaby długość 0 w poprzednim przypadku.

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

Tak, aby znaleźć długość, musisz przekonwertować na ciąg znaków, na przykład

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.