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.