2014-12-25 1 views
5

parseInt(1/10000000) 결과가 1 일 때 parseInt(1/1000000) 결과가 0 일 때?함수 parseInt (1/10000000)는 1을 반환합니다. 왜?

나는 0int i = -1/10000000;과 같은 Java의 int 캐스팅과 비슷한 것을 필요로합니다.

양성으로는 Math.floor을, 음수에는 Math.ceil을 사용해야합니까? 아니면 다른 해결책이 있습니까?

+0

raddix 매개 변수는 어떻습니까? 같은 결과가 나옵니까? –

+1

입니다. 1/10000000은 1e-7을 반환하고 1/1000000은 0.000001을 반환하기 때문입니다. 그것은 parseInt가 실제로 어떻게 작동하는지에 차이가 있습니다 ... – FrEaKmAn

+1

@TimVermaelen 같은 결과. –

답변

10

처음에 질문은 재미있을 것 같습니다. 그런 다음 1/10000000이 무엇인지 살펴 보았습니다. 따라서

< 1/10000000 
> 1e-7 

: 당신은 정수로 절단 할 경우

< parseInt("1e-7"); // note `parseInt` takes a STRING argument 
> 1 

,이 작업을 수행 할 수 있습니다

function truncateToInteger(real) { 
    return real - (real % 1); 
} 
+5

좀 더 흥미롭게도'parseInt (1/1000001)'은 9.입니다 : – PSL

+1

여기에 "inb4"주석의 비트가 있지만'return real >> 0; '이 작동하는 비트 32 비트 숫자로 제한되며'real real - (실수 % 1);은 모든 부동을 지원합니다. –

+0

또한 재미있는 점은 첫 번째 인수 인'parseInt'가 첫 번째 인수 ([spec (http://www.ecma-international.org/ecma-262/5.1/#sec-15.1)]에서'toString'을 호출한다는 것입니다. .2.2)),'parseFloat','toFixed'와'toPrecision'은 그렇지 않습니다. – adeneo

6

으로 parseInt 문자열 인수를 구문 분석 할 것으로 예상, 그래서로 변환 문자열 먼저.

1/1000000 문자열로 변환 할 때 "0.000001" 인 경우 parseInt는 "." 이후는 정수로만 사용되므로 0으로 읽습니다.

1/10000000 문자열로 변환하는 것은 과학적 표기법 "1e-7"를 사용하여 너무 작은, 그것은 단지 정수입니다 이후에서는 parseInt는, 이후 "E"모든 것을 무시, 그래서 1로 읽습니다.

기본적으로 parseInt는 사용자가 수행해야하는 작업이 아닙니다.

>(-1/10000000)|0 
0 

>1234.56|0 // truncation 
1234 

>(2147483647+1)|0 // integer overflow 
-2147483648 
: 자바 스크립트의 모든 비트 연산 32 비트 INT의 수를 강제로 0으로 논리합 연산하는 그 이상으로 값을 변경하지 않기 때문에

는 0을 숫자를 정수로 변환, OR하려면
+0

위대한 @baonn 오늘 새로운 것을 배웠습니다 –

+1

AFAIK, x | 0은 asm.js의 정수에 대한 유형 힌트이기도합니다. 그냥 재미있는 사실. –