JavaScript에서 float를 정수로 변환하고 싶습니다. 실제로, 나는 표준 변환의 두 가지를 수행하는 방법을 알고 싶습니다 : 잘림과 반올림. 효율적으로 문자열로 변환하고 파싱하지 않습니다.
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
var intValue = ~~floatValue;
. 표기법이 취향에 맞지 않으면, 함수에 숨기십시오 : function toInt(value) { return ~~value; }
. (이렇게하면 문자열을 정수로 변환 할 수도 있습니다.)
Math.trunc(val);
이것은 답변이 수락 되었기 때문에 의견을
2.3 - 2.3 % 1
비트 또는 연산자를 사용하여 부동 소수점 숫자를자를 수 있으며 양수뿐만 아니라 양수에도 사용할 수 있습니다.
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()
(최소한 Chrome에서 첫 번째 JSPerf 테스트 버전 30.0.1599.101을 실행 한 결과) 더 빠르며 (숫자가 비트로 표현되는 방식에 의존하지 않기 때문에) 이 비트 솔루션을 변경하고 깨뜨릴 수 있습니다), 가장 중요한 것은 더 명확합니다.
~~
단항 연산자이기 때문에 더 좋습니다. 4.2|0+4
동일 4
하지만 ~~4.2+4
동일8
참고 : Math.floor()
잘라내기를 대신 할 수는 Math.floor(-3.1) = -4
없습니다 -3
.
잘림을 대체하는 올바른 방법은 다음과 같습니다.
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
6 ECMAScript를 첨가 하였다
floor
-무한쪽으로 truncate
반올림하고 0으로 반올림합니다. ( ceil
+ 무한대로 반올림).
부동 비트 를 자르는 데 비트를 두 번 사용 하지 않는 연산자를 사용할 수 있습니다. 당신이 언급 한 다른 작업이 가능 통해 수 있습니다 Math.floor
, Math.ceil
그리고 Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
<canvas>
JS에서 글꼴 렌더링 엔진을 . 감사합니다!
자르기 :
var intvalue = Math.floor(value);
라운드 :
var intvalue = Math.round(value);
반올림없이 parseInt 메소드를 사용할 수 있습니다 . 0x (16 진수) 및 0 (8 진수) 접두사 옵션으로 인해 사용자 입력에주의하십시오.
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
1이 아닌 000 000 000 000 000 000 000 어쨌든, 문제는 명시 적으로 "싶지 않았다 한 결과, 문자열로 변환과 해석을 그 ... 비교적 작은 비록")
parseInt()
는 문자열 이 숫자가 아닌 첫 번째 매개 변수 이기 때문 입니다. 이 정수를 전달하면 정수로 변환 된 1e21
다음 parseInt
문자열 을 구문 분석하여 1e21
결과가됩니다 1
.
0으로의 비트 시프트는 1로 나누는 것과 같습니다.
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
정수 < 2 ^ 31-1 및 >>> 0
정수 < 2 ^ 32-1 에서만 작동하는 것 같습니다 . 더 큰 값의 경우 0을 반환합니다.
귀하의 경우 끝에 쉼표를 삽입하기 위해 문자열을 원할 때 Number.toFixed()
함수를 사용할 수도 있지만 반올림을 수행합니다.
여기에는 많은 제안이 있습니다. 비트 OR은 가장 간단한 것으로 보입니다. 다음은 모듈로 연산자를 사용하여 음수로 작동하는 또 다른 간단한 솔루션입니다. 비트 OR보다 이해하기가 더 쉽습니다.
intval = floatval - floatval%1;
이 방법은 또한 '| 0'또는 '~~'또는 '>> 0'이 올바르게 작동하지 않는 높은 값의 숫자에서도 작동합니다.
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
자르 려면 :
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
로 라운드 :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
한 가지 더 가능한 방법 — 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/에서 시도 하십시오.
Math
JavaScript에서 네이티브 객체를 살펴보면 숫자와 값 등을 다루는 함수가 많이 있습니다.
기본적으로 당신이하고 싶은 것은 JavaScript에서 매우 간단하고 기본입니다 ...
아래에 숫자가 있다고 상상해보십시오.
const myValue = 56.4534931;
이제 가장 가까운 숫자로 반올림하려면 간단히 다음을 수행하십시오.
const rounded = Math.floor(myValue);
그리고 당신은 얻을 :
56
가장 가까운 숫자로 반올림하려면 다음을 수행하십시오.
const roundedUp = Math.ceil(myValue);
그리고 당신은 얻을 :
57
또한 Math.round
플로트 수에 가까운 것에 따라 더 높거나 낮은 수로 반올림합니다.
또한 ~~
부동 소수점 뒤를 사용 하면 부동 소수점을 정수로 변환 할 수 있습니다.
당신은 그것을처럼 사용할 수 있습니다 ~~myValue
...
~~
수가 INT 32 한도보다 큰 경우는 INT 32 제한값 값을 변경하기 때문에.
나는 화폐 적으로 당신이 둥글게하지 말고 둥글게하고 싶다는 것을 지적하고 싶습니다. 4.999452 * 100 반올림하면 5가 더 대표적 답변이므로 1 페니로 내릴 가능성은 훨씬 적습니다.
그리고 은행의 반올림을 잊지 마십시오 . 이는 반올림이 제공하는 약간의 긍정적 인 편견을 극복하는 방법입니다. 재무 응용 프로그램에 필요할 수 있습니다.
angularjs를 사용하는 경우 HTML 템플릿 바인딩에서 다음과 같은 간단한 솔루션
{{val | number:0}}
val을 정수로 변환합니다
이 링크 docs.angularjs.org/api/ng/filter/number 로 이동하십시오 .