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
비트 NOTparseInt(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