[javascript] JavaScript에서 부동 수를 정수로 변환하려면 어떻게합니까?

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=x            x=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


답변

비트 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함수 로 사용하는 것이 안전 합니다.

그러나 positive뿐만 아니라 negatives와 함께 작업 하기 위해 코드가 필요한 경우 비트 연산이 가장 빠릅니다 (또는 선호되는 작업). 이 다른 JSPerf 테스트 는 추가 부호 확인으로 인해 Math가 이제 4 개 중 가장 느리다는 것이 명백한 부분에서 동일하게 비교 됩니다.

노트

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

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


답변

참고 : Math.floor()잘라내기를 대신 할 수는 Math.floor(-3.1) = -4없습니다 -3.

잘림을 대체하는 올바른 방법은 다음과 같습니다.

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

    return Math.floor(value);
}


답변

부동 비트 를 자르는 데 비트를 두 번 사용 하지 않는 연산자를 사용할 수 있습니다. 당신이 언급 한 다른 작업이 가능 통해 수 있습니다 Math.floor, Math.ceil그리고 Math.round.

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

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


답변

자르기 :

var intvalue = Math.floor(value);

라운드 :

var intvalue = Math.round(value);


답변

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

var intValue = parseInt(floatValue, 10);


답변

0으로의 비트 시프트는 1로 나누는 것과 같습니다.

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