JavaScript 또는 jQuery에서 숫자의 길이를 찾고 있습니까?
나는 value.length
성공하지 않고 시도했지만 이것을 먼저 문자열로 변환해야합니까?
JavaScript 또는 jQuery에서 숫자의 길이를 찾고 있습니까?
나는 value.length
성공하지 않고 시도했지만 이것을 먼저 문자열로 변환해야합니까?
답변:
var x = 1234567;
x.toString().length;
이 프로세스는 또한 효과 Float Number
가 Exponential number
있습니다.
좋아, 많은 답변이 있지만 이것은 재미를 위해 또는 수학이 중요하다는 것을 기억하기위한 순수한 수학입니다.
var len = Math.ceil(Math.log(num + 1) / Math.LN10);
이것은 실제로 지수 형식 인 경우에도 숫자의 "길이"를 제공합니다. num
음수가 아닌 경우, 음수가 아닌 경우 절대 값을 취한 후 부호를 조정하십시오.
이제는 Math.log10
일입니다 . 간단히 쓸 수 있습니다.
const len = Math.ceil(Math.log10(num + 1));
Math.ceil
더 빠르게 Math.abs
사용합니다. 하지만 솔직히 Chrome의 성능 향상을 기대하지는 못했습니다 ...
node.js 에서이 기능을 사용 해왔으며 지금까지 가장 빠른 구현입니다.
var nLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
양수와 음수를 지수 형식으로 처리해야하며 정수 부분의 길이를 부동 수로 반환해야합니다.
다음 참조는이 방법에 대한 통찰력을 제공해야합니다. Weisstein, Eric W. "Number Length." MathWorld--Wolfram 웹 리소스에서.
비트 비트 연산이 Math.abs를 대체 할 수 있다고 생각하지만 jsperf는 Math.abs가 대다수의 js 엔진에서 제대로 작동한다는 것을 보여줍니다.
업데이트 : 의견에서 언급 했듯이이 솔루션에는 몇 가지 문제가 있습니다.
Update2 (해결 방법) : 어느 시점에서 정밀도 문제가 발생하고 Math.log(...)*0.434...
예상치 못한 동작이 발생한다고 생각합니다 . 그러나 Internet Explorer 또는 모바일 장치가 차 한잔이 아닌 경우이 작업을 Math.log10
기능으로 대체 할 수 있습니다 . Node.js에서 함수 nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;
를 사용 Math.log10
하여 예상대로 작동 하는 빠른 기본 테스트를 작성 했습니다. 주의하시기 바랍니다 Math.log10
보편적으로 지원되지 않습니다.
정수를 문자열로 변환하지 않으면 펑키 루프를 만들 수 있습니다.
var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
++length;
i = Math.floor(i/10);
}
alert(length);
.
계산의 일부로 포함 됩니다.
먼저 문자열로 변환하십시오.
var mynumber = 123;
alert((""+mynumber).length);
빈 문자열을 추가하면 암시 적 mynumber
으로 문자열로 바뀝니다.
세 가지 방법이 있습니다.
var num = 123;
alert(num.toString().length);
더 나은 성능 하나 (ie11에서 최고의 성능)
var num = 123;
alert((num + '').length);
수학 (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
가장 간단한 것 (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);
}
테스트에서 비슷한 질문을 받았습니다.
문자열로 변환하지 않고 숫자 길이 찾기
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 ()입니다.