Bagaimana saya bisa menemukan panjang angka?

161

Saya ingin mendapatkan panjang angka dalam JavaScript atau jQuery?

Saya sudah mencoba value.lengthtanpa hasil, apakah saya perlu mengonversinya menjadi string terlebih dahulu?

Kode Junkie
sumber
3
Ya, ubah menjadi string. Konsep "panjang" angka hanya bermakna dalam hal skema representasi angka.
Runcing
Ya, Anda harus mengonversi ke string terlebih dahulu, IE (1234) .toString (). Panjang
Osama Bari
Benchmark untuk 3 jawaban teratas: measuringethat.net/Benchmarks/ShowResult/92276
Richie Bendall

Jawaban:

304
var x = 1234567;

x.toString().length;

Proses ini juga akan bekerja untuk Float Numberdan untuk Exponential numberjuga.

theodeparadox
sumber
9
Memberi +1. Jika tidak jelas bagi siapa pun, titik desimal dalam pelampung akan dihitung dalam panjang string. misal 2.5.toString (). panjang keluaran 3.
dading84
1
@ dading84: Saya kira Math.floor () akan memperbaikinya: Math.floor (99.5454) .toString (). length === 2
Manfred
7
Solusi ini tidak akan berfungsi dengan angka besar atau kecil yang memiliki lebih dari 20 digit. misalnya. 1.2e + 22 toString (). Output panjang 7
CherylG
Juga perlu dicatat ini sangat lambat. Saya melakukan tes dalam simpul dan ternyata lebih lambat 1200% dari jawaban Arturs.
Oliver Dixon
1
Ini bukan solusi yang baik, contoh: const val = 0295; const x = val.toString (). length; console.log (x) // outputnya adalah: 3
karolkarp
82

Ok, begitu banyak jawaban, tetapi ini adalah matematika murni, hanya untuk bersenang-senang atau mengingat bahwa Matematika itu Penting:

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

Ini sebenarnya memberikan "panjang" angka bahkan jika itu dalam bentuk eksponensial. numseharusnya bilangan bulat bukan negatif di sini: jika bilangan negatif, ambil nilai absolutnya dan sesuaikan tanda setelahnya.

Pembaruan untuk ES2015

Sekarang Math.log10adalah suatu hal , Anda cukup menulis

const len = Math.ceil(Math.log10(num + 1));
MaxArt
sumber
1
Saya pikir ini matematika murni yang paling efisien / tercepat.
Noitidart
2
Awesme perf man terima kasih. Hasil yang saya dapat menunjukkan cara matematika fastet, apakah ini hasil yang Anda dapatkan? ini hasil saya: i.imgur.com/9BKxyd3.png
Noitidart
1
@ HubertGrzeskowiak Oh itu bagus. Saya melihat metode itu pada dasarnya adalah matematika, tetapi dengan beberapa peretasan cepat. Ini menjatuhkan Math.ceildan menggunakan yang lebih cepat Math.abssebagai gantinya. Tapi sejujurnya saya tidak mengharapkan kenaikan kinerja di Chrome ... Senang tahu!
MaxArt
3
Sempurna, tetapi memberi 0 jika nomor Anda adalah 0 sebagai gantinya 1
StateLess
1
Pada 1e + 16 atau lebih ia memberi 1 lebih sedikit, jadi 1000000000000000000 mengembalikan 16 bukannya 17 dan seterusnya ...
Goty Metal
12

Saya telah menggunakan fungsi ini di node.js, ini adalah implementasi tercepat saya sejauh ini:

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

Ini harus menangani bilangan bulat positif dan negatif (juga dalam bentuk eksponensial) dan harus mengembalikan panjang bagian bilangan bulat dalam pelampung.

Referensi berikut harus memberikan beberapa wawasan tentang metode ini: Weisstein, Eric W. "Panjang Angka." Dari MathWorld - Sumber Daya Web Wolfram.

Saya percaya bahwa beberapa operasi bitwise dapat menggantikan Math.abs, tetapi jsperf menunjukkan bahwa Math.abs bekerja dengan baik di sebagian besar mesin js.

Pembaruan : Seperti disebutkan dalam komentar, solusi ini memiliki beberapa masalah :(

Update2 (pemecahan masalah) : Saya percaya bahwa pada suatu titik masalah presisi muncul dan orang yang Math.log(...)*0.434...berperilaku tidak terduga. Namun, jika Internet Explorer atau perangkat Mobile bukan secangkir teh Anda, Anda dapat mengganti operasi ini dengan Math.log10fungsinya. Di Node.js saya menulis tes dasar cepat dengan fungsi nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;dan dengan Math.log10itu berfungsi seperti yang diharapkan. Harap dicatat bahwa Math.log10tidak didukung secara universal.

Israfil Havilah
sumber
Sebagai rasa ingin tahu saya telah melakukan JsPerf dengan metode nLength vs toString (). Length pada ini .... jsperf.com/convert-number-to-string-and-get-length/2
Israfil Havilah
Haha, itu pada dasarnya solusi yang saya berikan! Saya tidak tahu itu bisa bekerja dengan sangat baik.
MaxArt
2
Maaf, apakah saya mengatakan sesuatu tentang saya yang menemukan solusi atau sesuatu seperti itu? Mengapa Anda tidak membaca dengan cermat sebelum memposting? Untuk masalah ini, algoritme ditemukan jauh sebelum Steven Wolfram lahir, dan lagi pula halaman yang Anda tautkan tidak memberikan solusi dalam Javascript. Sudah , 9 bulan sebelum Anda.
MaxArt
1
"+1" mungkin harus di luar panggilan Math.abs: Math.log (Math.abs (n) +1) ...
Hubert Grzeskowiak
1
Pada 1e + 16 atau lebih ia memberi 1 lebih sedikit, jadi 1000000000000000000 mengembalikan 16 bukannya 17 dan seterusnya ...
Goty Metal
11

Anda harus membuat angka ke string agar panjang

var num = 123;

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

atau

alert(num.toString().length);
Adil
sumber
9

Bisa juga menggunakan string templat:

const num = 123456
`${num}`.length // 6
funador
sumber
ini adalah satu-satunya jawaban yang berfungsi untuk saya karena saya menghitung angka yang dimulai dengan 0.
jessiPP
5

Baik tanpa mengonversi bilangan bulat menjadi string, Anda dapat membuat lingkaran yang funky:

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/

Naftali alias Neal
sumber
3
@Pointy ya, ini dengan asumsi integer. Bahkan jika Anda membuatnya menjadi string, itu akan termasuk .sebagai bagian dari perhitungan.
Naftali alias Neal
ya, meskipun ini merupakan pertanyaan filosofis yang menarik apakah titik harus dimasukkan dalam "panjang" :-)
Pointy
4

Konversikan dulu menjadi string:

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

Menambahkan string kosong ke dalamnya akan secara implisit menyebabkan mynumberberubah menjadi string.

tskuzzy
sumber
1
Tidak bekerja dengan eksponensial seperti 1e + 16 yang mengembalikan 5.
Goty Metal
4

Ada tiga cara untuk melakukannya.

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

kinerja yang lebih baik (kinerja terbaik dalam ie11)

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

Matematika (kinerja terbaik di Chrome, firefox tetapi paling lambat di ie11)

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

ada jspref di sini http://jsperf.com/fastest-way-to-get-the-first-in-a-nn//

Eric Chen
sumber
4

Anda harus menggunakan yang paling sederhana (stringLength), keterbacaan selalu mengalahkan kecepatan. Tetapi jika Anda peduli kecepatan di sini ada beberapa di bawah ini.

Tiga metode berbeda semuanya dengan kecepatan yang bervariasi.

// 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);
}
Oliver Dixon
sumber
3

Saya mendapat pertanyaan serupa dalam tes.

Temukan panjang angka tanpa mengubahnya menjadi string

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 ]

Angka negatif ditambahkan untuk mempersulitnya sedikit lebih, maka Math.abs ().

Adrian Lynch
sumber
2

Saya ingin memperbaiki jawaban @Neal yang cukup bagus untuk bilangan bulat, tetapi angka 1 akan mengembalikan panjang 0 pada kasus sebelumnya.

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;
}
Gregzenegair
sumber
0

Ya, Anda perlu mengonversi ke string untuk menemukan panjangnya. Misalnya

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.
kamal
sumber