etc./StackOverFlow

JavaScript에서 부동 소수점 수를 정수로 어떻게 변환합니까?

청렴결백한 만능 재주꾼 2023. 4. 24. 06:47
반응형

질문자 :mcherm


JavaScript에서 float를 정수로 변환하고 싶습니다. 사실, 저는 표준 변환을 모두 수행하는 방법을 알고 싶습니다: 자르기 및 반올림. 그리고 효율적으로 문자열로 변환하고 구문 분석하지 않습니다.



var intvalue = Math.floor( floatvalue ); var intvalue = Math.ceil( floatvalue ); var intvalue = Math.round( floatvalue ); // `Math.trunc` was added in ECMAScript 6 var intvalue = Math.trunc( floatvalue );

수학 개체 참조


긍정적 인
 // value=x // x=5 5<x<5.5 5.5<=x<6 Math.floor(value) // 5 5 5 Math.ceil(value) // 5 6 6 Math.round(value) // 5 5 6 Math.trunc(value) // 5 5 5 parseInt(value) // 5 5 5 ~~value // 5 5 5 value | 0 // 5 5 5 value >> 0 // 5 5 5 value >>> 0 // 5 5 5 value - value % 1 // 5 5 5
부정적인
 // value=x // x=-5 -5>x>=-5.5 -5.5>x>-6 Math.floor(value) // -5 -6 -6 Math.ceil(value) // -5 -5 -5 Math.round(value) // -5 -5 -6 Math.trunc(value) // -5 -5 -5 parseInt(value) // -5 -5 -5 value | 0 // -5 -5 -5 ~~value // -5 -5 -5 value >> 0 // -5 -5 -5 value >>> 0 // 4294967291 4294967291 4294967291 value - value % 1 // -5 -5 -5
양수 - 더 큰 숫자
 // x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1 // value=xx=900719925474099 x=900719925474099.4 x=900719925474099.5 Math.floor(value) // 900719925474099 900719925474099 900719925474099 Math.ceil(value) // 900719925474099 900719925474100 900719925474100 Math.round(value) // 900719925474099 900719925474099 900719925474100 Math.trunc(value) // 900719925474099 900719925474099 900719925474099 parseInt(value) // 900719925474099 900719925474099 900719925474099 value | 0 // 858993459 858993459 858993459 ~~value // 858993459 858993459 858993459 value >> 0 // 858993459 858993459 858993459 value >>> 0 // 858993459 858993459 858993459 value - value % 1 // 900719925474099 900719925474099 900719925474099
음수 - 더 큰 숫자
 // x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1 // value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6 Math.floor(value) // -900719925474099 -900719925474100 -900719925474100 Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099 Math.round(value) // -900719925474099 -900719925474099 -900719925474100 Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099 parseInt(value) // -900719925474099 -900719925474099 -900719925474099 value | 0 // -858993459 -858993459 -858993459 ~~value // -858993459 -858993459 -858993459 value >> 0 // -858993459 -858993459 -858993459 value >>> 0 // 3435973837 3435973837 3435973837 value - value % 1 // -900719925474099 -900719925474099 -900719925474099

moonshadow

비트 OR 연산자

비트 또는 연산자는 부동 소수점 숫자를 자르는 데 사용할 수 있으며 음수뿐만 아니라 양수에 대해서도 작동합니다.

 function float2int (value) { return value | 0; }

결과

 float2int(3.1) == 3 float2int(-3.1) == -3 float2int(3.9) == 3 float2int(-3.9) == -3

성능 비교?

다음과 같은 성능을 비교 하는 JSPerf 테스트 를 만들었습니다.

  • Math.floor(val)
  • val | 0 비트 OR
  • ~~val 비트 NOT
  • parseInt(val)

양수에서만 작동합니다. 이 경우 비트 연산과 Math.floor 함수를 사용하는 것이 안전합니다.

그러나 코드 가 양수뿐만 아니라 음수와 함께 작동 해야 하는 경우 비트 연산이 가장 빠릅니다(또는 선호되는 연산). 이 다른 JSPerf 테스트 는 추가 부호 검사로 인해 Math가 이제 4개 중 가장 느립니다.

메모

주석에서 언급했듯이 BITWISE 연산자는 부호 있는 32비트 정수에서 작동하므로 큰 숫자는 다음과 같이 변환됩니다.

 1234567890 | 0 => 1234567890 12345678901 | 0 => -539222987

Robert Koritnik

참고 : 사용할 수 없습니다 Math.floor() , 잘라 내기를 대체하기 때문에 Math.floor(-3.1) = -4 하지 -3 !

truncate의 올바른 대체는 다음과 같습니다.

 function truncate(value) { if (value < 0) { return Math.ceil(value); } return Math.floor(value); }

user189987

이중 비트 not 연산자를 사용하여 부동 소수점을자를 수 있습니다. 언급한 다른 작업은 Math.floor , Math.ceilMath.round 통해 사용할 수 있습니다.

 > ~~2.5 2 > ~~(-1.4) -1

자세한 내용은 James Padolsey가 제공했습니다.


brad

자르기:

 var intvalue = Math.floor(value);

라운드:

 var intvalue = Math.round(value);

Mike

반올림하지 않으 려면 parseInt 메서드를 사용할 수 있습니다. 0x(16진수) 및 0(8진수) 접두사 옵션으로 인해 사용자 입력에 주의하십시오.

 var intValue = parseInt(floatValue, 10);

편집: 경고 (주석 섹션에서)로, 특정 숫자 값은 "1" 의 잘못된 십진수 표현이 1e21


Graeme Wicksted

1로 나누는 것과 동일한 0으로 비트 시프트

 // >> or >>> 2.0 >> 0; // 2 2.0 >>> 0; // 2

Prasanth

귀하의 경우 끝에 문자열을 원할 때 (쉼표를 삽입하기 위해) Number.toFixed() 함수를 사용할 수도 있지만 반올림이 수행됩니다.


Russell Leggett

여기에 많은 제안이 있습니다. 비트 OR은 지금까지 가장 간단한 것 같습니다. 다음은 모듈로 연산자를 사용하여 음수에서도 작동하는 또 다른 짧은 솔루션입니다. 비트 OR보다 이해하기 쉬울 것입니다.

 intval = floatval - floatval%1;

이 방법은 '|0'도 '~~'도 '>>0'도 제대로 작동하지 않는 높은 값의 숫자에서도 작동합니다.

 > n=4294967295; > n|0 -1 > ~~n -1 > n>>0 -1 > nn%1 4294967295

Juliane Holzt

또 다른 가능한 방법 — XOR 연산을 사용합니다.

 console.log(12.3 ^ 0); // 12 console.log("12.3" ^ 0); // 12 console.log(1.2 + 1.3 ^ 0); // 2 console.log(1.2 + 1.3 * 2 ^ 0); // 3 console.log(-1.2 ^ 0); // -1 console.log(-1.2 + 1 ^ 0); // 0 console.log(-1.2 - 1.3 ^ 0); // -2

비트 연산의 우선 순위는 수학 연산의 우선 순위보다 낮으므로 유용합니다. https://jsfiddle.net/au51uj3r/에서 시도하십시오.


Dmitry Kharitonov

 //Convert a float to integer Math.floor(5.95) //5 Math.ceil(5.95) //6 Math.round(5.4) //5 Math.round(5.5) //6 Math.trunc(5.5) //5 //Quick Ways console.log(5.95| 0) console.log(~~5.95) console.log(5.95 >> 0) //5


pk_code

자르 려면:

 // Math.trunc() is part of the ES6 spec console.log(Math.trunc( 1.5 )); // returns 1 console.log(Math.trunc( -1.5 )); // returns -1 // Math.floor( -1.5 ) would return -2, which is probably not what you wanted

반올림 하려면:

 console.log(Math.round( 1.5 )); // 2 console.log(Math.round( 1.49 )); // 1 console.log(Math.round( -1.6 )); // -2 console.log(Math.round( -1.3 )); // -1


Razor

JavaScript의 기본 Math 개체를 살펴보면 숫자와 값 등에 대해 작업하는 전체 함수를 얻을 수 있습니다.

기본적으로 원하는 것은 JavaScript에서 매우 간단하고 기본적입니다...

아래 번호가 있다고 상상해보십시오.

 const myValue = 56.4534931;

이제 가장 가까운 숫자로 반올림하려면 다음을 수행하십시오.

 const rounded = Math.floor(myValue);

그리고 당신은 얻을:

 56

가장 가까운 숫자로 반올림하려면 다음을 수행하십시오.

 const roundedUp = Math.ceil(myValue);

그리고 당신은 얻을:

 57

또한 Math.round 는 더 높은 숫자 또는 더 낮은 숫자로 반올림하는 것이 플로트 숫자에 더 가까운 숫자에 따라 다릅니다.

~~ 를 사용하여 부동 소수점을 정수로 변환할 수 있습니다.

~~myValue 와 같이 사용할 수 있습니다 ...


Alireza

성능

오늘 2020.11.28 선택한 솔루션에 대해 Chrome v85, Safari v13.1.2 및 Firefox v80의 MacOs HighSierra 10.13.6에서 테스트를 수행합니다.

결과

  • 모든 브라우저에 대해 모든 솔루션(B 및 K 제외)은 매우 유사한 속도 결과를 제공합니다.
  • 솔루션 B와 K는 느림

여기에 이미지 설명 입력

세부

여기에서 실행할 수 있는 테스트 케이스를 수행합니다.

아래 스니펫은 솔루션 간의 차이점을 나타냅니다. A B C D E F G H I J K L

 function A(float) { return Math.trunc( float ); } function B(float) { return parseInt(float); } function C(float) { return float | 0; } function D(float) { return ~~float; } function E(float) { return float >> 0; } function F(float) { return float - float%1; } function G(float) { return float ^ 0; } function H(float) { return Math.floor( float ); } function I(float) { return Math.ceil( float ); } function J(float) { return Math.round( float ); } function K(float) { return float.toFixed(0); } function L(float) { return float >>> 0; } // --------- // TEST // --------- [A,B,C,D,E,F,G,H,I,J,K,L] .forEach(f=> console.log(`${f.name} ${f(1.5)} ${f(-1.5)} ${f(2.499)} ${f(-2.499)}`))
 This snippet only presents functions used in performance tests - it not perform tests itself!

다음은 크롬에 대한 예시 결과입니다.

여기에 이미지 설명 입력


Kamil Kiełczewski

저는 금전적으로 여러분이 자르지 않고 반올림하기를 원한다는 점을 지적하고 싶습니다. 4.999452 * 100을 반올림하면 더 대표적인 답인 5가 나오기 때문에 한 푼도 차이가 날 가능성이 훨씬 적습니다.

그리고 무엇 보다도 은행원의 반올림을 잊지 마십시오. 이는 직선 반올림이 제공하는 약간 긍정적인 편향에 대응하는 방법입니다. 재무 응용 프로그램에서 필요할 수 있습니다.

JavaScript의 가우스/뱅커 반올림


Gerard ONeill

angularjs를 사용하는 경우 HTML 템플릿 바인딩에서 다음과 같은 간단한 솔루션

{{val | number:0}}

val을 정수로 변환합니다.

이 링크로 이동하십시오 .docs.angularjs.org/api/ng/filter/number


Jameel Grand

출처 : http:www.stackoverflow.com/questions/596467/how-do-i-convert-a-float-number-to-a-whole-number-in-javascript

반응형