2012-07-05 3 views
2

큰 소수를 얻기 위해 parseInt()를 사용했지만 예상대로 작동합니다. 예 :JavaScript에서 parseInt()를 사용하는 방법

parseInt("18014398241046527", 10); // Gives me 18014398241046528?? 
parseInt("18014398241046528", 10); // Gives me 18014398241046528 
parseInt("18014398241046529", 10); // Still gives me 18014398241046528?? 

Chrome 버전 20.0.1132.47 및 Firefox 12.0에서 테스트했습니다. 왜냐하면 내가 분석하려고했던 숫자가 너무 컸기 때문입니까?

+1

너무 크지 않습니다. 유효 자릿수가 너무 많습니다. – nnnnnn

+0

P. 'parseInt()'의 문제는 아니며, JS 번호가 작동하는 것과 같습니다. [BigNumber] (http://jsfromhell.com/classes/bignumber)와 같이 유효 숫자를 처리 할 수있는 JS 라이브러리가 주위에 있습니다. – nnnnnn

+0

여기에 넘치는 패턴이있는 것 같습니다. 모두 2 바이트에서 시작하고 01, 10, 11은 10이고 00은 00

0 '->' 11111111111111110 1 '->' 11111111111111112 2 '->' 11111111111111112 3 '->' 11111111111111112 4 '->' 11111111111111114 5 '->' 11111111111111116 6 '->' 11111111111111116 7 '->' 11111111111111116 8 '->' 11111111111111118
dolaameng

답변

0

parseInt의 경우에는 문제가되지 않습니다. 이 숫자는 JavaScript의 Number 데이터 유형 (증명 : +"18014398241046527" 수확량은 18014398241046528)에도 너무 길다 (너무 정확하게 - nhahtdh의 답변 참조).

이 문제를 해결하는 유일한 방법은 숫자를 문자열로 입력하고 청크로 작업하는 것입니다.

+0

"... 증명 ..."이 될 것입니까? 당신은 사악 할 수 없습니다. 입증 할 수있는 V8 코드와 SpiderMonkey 코드가 있습니다. – Alexander

+0

@Alexander - 다른 문자열에서 숫자로 변환하는 메소드가 같은 문제를 가지고 있다는 사실은 "문제"가 단지'parseInt()'와 같지 않음을 증명합니다. . nhahtdh의 대답은 실제로 더 정확히 정확합니다 (하! 내가 한 일을 참조하십시오). 기본 JS 엔진 코드는 여기에서 관련이 없습니다. – nnnnnn

+3

@nnnnnn, 나는 다른 말로 표현할 것입니다 : 최소한 표준을 인용하십시오. 그 "증명"은 여전히 ​​유용한 것을 수렴하지 않습니다. JS 엔진 구현은 잘못 될 수 있지만이 정도의 정보로는 알 수 없습니다. – Alexander

5

JavaScript의 숫자는 최대 53 비트의 정밀도 (약 16 진수) 만 포함 할 수있는 부동 소수점 배정 밀도입니다. 질문에있는 번호는 17 자리이므로 번호를 정확하게 저장할 수 없습니다.

위키 백과 문서 JavaScript syntax/Number.

JavaScript (1.1) standard에 대한 참조.

관련 문제