Làm thế nào tôi có thể tìm thấy độ dài của một số?


161

Tôi đang tìm cách lấy độ dài của một số trong JavaScript hoặc jQuery?

Tôi đã thử value.lengthmà không thành công, tôi có cần chuyển chuỗi này thành chuỗi trước không?


3
Vâng, chuyển đổi nó thành một chuỗi. Khái niệm "độ dài" của một số chỉ có ý nghĩa về mặt một số sơ đồ biểu diễn số.
Mũi nhọn

Có, trước tiên bạn cần chuyển đổi thành chuỗi, IE (1234) .toString (). Chiều dài
Osama Bari

Điểm chuẩn cho 3 câu trả lời hàng đầu: đoethat.net/
Richie Bendall

Câu trả lời:


304
var x = 1234567;

x.toString().length;

Quá trình này cũng sẽ làm việc cho Float NumberExponential numbercũng cho .


9
+ 1'd. Trong trường hợp không rõ ràng với bất kỳ ai, dấu thập phân trong số float sẽ được tính theo độ dài chuỗi. ví dụ: 2.5.toString (). chiều dài đầu ra 3.
dading84

1
@ dading84: tôi đoán Math.floor () sẽ sửa lỗi đó: Math.floor (99.5454) .toString (). length === 2
Manfred

7
Giải pháp này sẽ không hoạt động với số lớn hoặc số nhỏ có hơn 20 chữ số. ví dụ. 1.2e + 22 toString (). Độ dài đầu ra 7
CherylG

Ngoài ra để lưu ý điều này là cực kỳ chậm. Tôi đã làm một bài kiểm tra trong nút và hóa ra nó chậm hơn 1200% so với câu trả lời của Arturs.
Oliver Dixon

1
Đó không phải là giải pháp tốt, ví dụ: const val = 0295; const x = val.toString (). chiều dài; console.log (x) // đầu ra là: 3
karolkarp

82

Ok, rất nhiều câu trả lời, nhưng đây là một bài toán thuần túy, chỉ để giải trí hoặc để nhớ rằng Toán học là Quan trọng:

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

Điều này thực sự mang lại "độ dài" của số ngay cả khi nó ở dạng hàm mũ. numđược coi là một số nguyên không âm ở đây: nếu nó âm, lấy giá trị tuyệt đối của nó và điều chỉnh dấu sau đó.

Cập nhật cho ES2015

Bây giờ đó Math.log10là một điều , bạn chỉ cần viết

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

1
tôi nghĩ rằng toán học thuần túy này là hiệu quả nhất / nhanh nhất.
Noitidart

2
Awesme perf man cảm ơn. Kết quả tôi nhận được cho thấy cách toán là fastet, đây có phải là kết quả bạn nhận được không? đây là kết quả của tôi: i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak Ôi thật tuyệt. Tôi thấy phương pháp đó về cơ bản là một phương pháp toán học, nhưng với một số hack tốc độ. Nó giảm một Math.ceilvà sử dụng nhanh hơn Math.absthay thế. Nhưng tôi thực sự không mong đợi rằng hiệu suất đạt được trong Chrome ... Rất vui được biết!
MaxArt

3
Hoàn hảo, nhưng cho 0 nếu số của bạn là 0 thay vì 1
StateLess

1
Ở mức 1e + 16 trở lên, nó cung cấp ít hơn 1, vì vậy 10000000000000000 trả về 16 thay vì 17 và cứ thế ...
Goty Metal

12

Tôi đã sử dụng chức năng này trong node.js, đây là cách triển khai nhanh nhất của tôi cho đến nay:

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

Nó nên xử lý các số nguyên dương và âm (cũng ở dạng hàm mũ) và sẽ trả về độ dài của phần nguyên trong số float.

Tài liệu tham khảo sau đây sẽ cung cấp một số cái nhìn sâu sắc về phương pháp: Weisstein, Eric W. "Số chiều dài." Từ MathWorld - Một tài nguyên web Wolfram.

Tôi tin rằng một số thao tác bitwise có thể thay thế Math.abs, nhưng jsperf cho thấy Math.abs hoạt động tốt trong phần lớn các công cụ js.

Cập nhật : Như đã lưu ý trong các nhận xét, giải pháp này có một số vấn đề :(

Update2 (cách giải quyết) : Tôi tin rằng tại một số điểm, các vấn đề chính xác sẽ xảy ra và Math.log(...)*0.434...chỉ hành xử bất ngờ. Tuy nhiên, nếu Internet Explorer hoặc thiết bị di động không phải là tách trà của bạn, bạn có thể thay thế thao tác này bằng Math.log10chức năng. Trong Node.js tôi đã viết một bài kiểm tra cơ bản nhanh chóng với hàm nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;và với Math.log10nó hoạt động như mong đợi. Xin lưu ý rằng Math.log10không được hỗ trợ phổ biến.


Vì tò mò tôi đã thực hiện một JsPerf với phương pháp nLpm so với toString (). Độ dài này .... jsperf.com/convert-number-to-opes-and-get-length/2
Israfil Havilah

Haha, về cơ bản là giải pháp tôi cung cấp! Tôi không biết nó có thể thực hiện tốt như vậy.
MaxArt

2
Tôi xin lỗi, tôi đã nói điều gì đó về việc tôi phát minh ra giải pháp hay đại loại như thế chưa? Tại sao bạn không đọc kỹ trước khi đăng? Đối với vấn đề này, chứng rối loạn nhịp tim đã được phát hiện trước khi Steven Wolfram ra đời và dù sao trang bạn liên kết không cung cấp giải pháp trong Javascript. Tôi đã làm, 9 tháng trước bạn.
MaxArt

1
"+1" có lẽ nằm ngoài cuộc gọi Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak

1
Ở mức 1e + 16 trở lên, nó cung cấp ít hơn 1, vì vậy 10000000000000000 trả về 16 thay vì 17 và cứ thế ...
Goty Metal

11

Bạn phải tạo số thành chuỗi để có độ dài

var num = 123;

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

hoặc là

alert(num.toString().length);

9

Cũng có thể sử dụng một chuỗi mẫu:

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

đây là câu trả lời duy nhất phù hợp với tôi vì tôi đếm một số bắt đầu bằng 0.
jessiPP

5

Vâng, không cần chuyển đổi số nguyên thành một chuỗi, bạn có thể tạo một vòng lặp thú vị:

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

alert(length);​

Bản trình diễn: http://jsfiddle.net/manoder/G8tQE/


3
@Pointy có, đây là giả sử một số nguyên. Ngay cả khi bạn biến nó thành một chuỗi, nó sẽ bao gồm phần .như là một phần của phép tính.
Naftali aka Neal

vâng, mặc dù đó là một câu hỏi triết học thú vị, liệu dấu chấm có nên được đưa vào "chiều dài" :-)
Pointy

4

Đầu tiên chuyển đổi nó thành một chuỗi:

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

Thêm một chuỗi trống vào nó sẽ khiến chúng mynumberbiến thành một chuỗi.


1
Không hoạt động với các số mũ như 1e + 16 trả về 5.
Goty Metal

4

Có ba cách để làm điều đó.

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

hiệu suất tốt hơn một (hiệu suất tốt nhất trong eg11)

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

Toán học (hiệu suất tốt nhất trong Chrome, firefox nhưng chậm nhất là eg11)

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

có một jspref ở đây http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

Bạn nên đi đơn giản nhất (chuỗiLL), khả năng đọc luôn vượt qua tốc độ. Nhưng nếu bạn quan tâm về tốc độ thì đây là một số dưới đây.

Ba phương pháp khác nhau với tốc độ khác nhau.

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

Tôi đã hỏi một câu hỏi tương tự trong một bài kiểm tra.

Tìm độ dài của một số mà không chuyển đổi thành chuỗi

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 ]

Các số âm được thêm vào để làm phức tạp thêm một chút, do đó Math.abs ().


2

Tôi muốn sửa câu trả lời @Neal khá tốt cho số nguyên, nhưng số 1 sẽ trả về độ dài bằng 0 trong trường hợp trước.

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

Có, bạn cần chuyển đổi thành chuỗi để tìm độ dài. Ví dụ:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.