parseInt (1/0, 19)가 18을 반환하는 이유는 무엇입니까?


853

JavaScript 에서 성가신 문제가 있습니다 있습니다.

> parseInt(1 / 0, 19)
> 18

parseInt함수 가 왜 반환 18됩니까?


3
흥미 롭군 그러나 왜 이것이 귀찮은 문제입니까? 다른 방법으로 Infinity를 처리해야합니까? 그렇다면 if도움 이 될 수 있습니다.
Thilo

254
도대체 무엇을하고 있었습니까? 19 번째 숫자 또는 0으로 나누는 작업이 필요했습니다!?
Jack M

19
JS에 대해 혼란 스러울 때이 인용문 으로 돌아가서 전체 언어가 10 일 이내에 설계되고 구현되었음을 기억하십시오 (해당 사람에 따라).
tylerl

32
FAQ에서 : "실제로 직면하고있는 실제 문제를 바탕으로 실용적이고 답변 가능한 질문 만해야합니다." 이것은 실제로 당신이 실제로 직면하는 "성가신 문제"가 아니며 , 인터넷에 영원히 떠 다니는 비현실적인 예 입니다 .
Jeremy Banks

2
python도 같은 일을한다 : int ( 'I', 19) == 18
oberhamsi

답변:


1292

의 결과는 1/0입니다 Infinity.

parseInt첫 번째 인수를 문자열로 취급합니다. 이는 먼저 문자열이 생성됨을 의미 Infinity.toString()합니다 "Infinity". 따라서 변환을 요청한 것과 동일하게 작동합니다."Infinity" 기본 19에서 십진수 .

밑이 19 인 숫자와 소수 값은 다음과 같습니다.

Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18

다음에 발생하는 일은 parseInt입력 "Infinity"을 스캔하여 구문 분석 할 수있는 부분을 찾은 후 첫 번째 부분을 승인 한 후 중지합니다 I( n기본 19의 유효한 숫자가 아니기 때문에 ).

따라서 마치 parseInt("I", 19)위의 표에서 십진수 18로 변환하는 것처럼 호출 한 것처럼 동작 합니다.


32
@mithunsatheesh 사용해보십시오 parseInt('Infini',24).
Supr

112
@mithunsatheesh : 24 n자릿수도 유효한 숫자이기 때문에 실제로 끝납니다 parseInt("Infini", 24).
Jon

36
누군가가 이런 식으로 작동하는 언어로 '프로그램'하기를 원하는 이유는 저에게 있습니다.
Frans Bouma

45
@FransBouma : JS는 그 자체로 아름답습니다. 그리고 실제로, 여기에서 일어나는 일의 일부는 역동적 인 언어로 불합리합니다.
Jon

59
@Jon :이 인공물은 동적 언어의 결과가 아닙니다. 느슨하게 입력 한 결과입니다. 엄격하게 형식화 된 동적 언어에서는 이러한 종류의 어리 석음을 막기 위해 Infinity (float)를 "Infinity"(string)로 암시 적으로 변환하지 않습니다.
Lie Ryan

225

이벤트 순서는 다음과 같습니다.

  • 1/0 ~에 평가하다 Infinity
  • parseInt기본 19의 18 인 Infinity메모를 읽고 행복하게 읽습니다.I
  • parseInt 문자열을 변환 할 수 없으므로 나머지 문자열을 무시합니다.

어떤 base에 대해서도 결과를 얻을 수 >= 19있지만 그 아래 에있는 base 는 그렇지 않습니다. bases의 >= 24경우 n해당 지점에서 유효한 숫자가되므로 더 큰 결과를 얻을 수 있습니다 .


@ Thilo BTW, 이유가 무엇입니까, 왜 베이스가 더 크면 19에서 멈출 있습니까? 아시다시피, JS가 반복 할 수있는 가장 큰 기본 JS는 무엇입니까?
Arnthor

4
@Nordvind parseInt영어 알파벳에는 26자가 있기 때문에 가장 큰 기준 은 36입니다. 규칙은 숫자를 사용하고 주어진 기준에서 유효한 숫자 집합으로 문자를 사용하는 것입니다.
Craig Citro

4
글 머리 기호 # 2에서 ...로 변경 Infinity을 제안 할 수 있습니다 "Infinity".
CJBS

38

위의 답변에 추가하려면 다음을 수행하십시오.

parseInt는 문자열을 숫자로 구문 분석하기위한 것입니다 (단서는 이름에 있습니다). 귀하의 상황에서는 1/0이 이미 숫자이므로 구문 분석을 전혀 원하지 않으므로 기능의 이상한 선택입니다. 숫자가 있고 특정 기준으로 변환하려면 대신 기수와 함께 toString을 사용해야 합니다.

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

13

위의 답변에 추가하려면

parseInt(1/0,19) 에 해당 parseInt("Infinity",19)

기본 19 자리 이내 0-9이며 A-I (or a-i)유효한 숫자입니다. 따라서 "무한대" I에서 기본 19를 취하고 기본 10으로 변환하여 18이됩니다. 그러면 다음 문자를 가져 오려고합니다.n 기본 19에없는 (따라서 자바 스크립트의 문자열을 숫자로 변환하는 동작에 따라) )

따라서 parseInt("Infinity",19)OR parseInt("I",19)OR 를 쓰면 parseInt("i",19)결과는 동일 18합니다.

당신이 쓰는 지금, 만약 parseInt("I0",19)결과가 될 것 342 으로 I X 19 (the base)^1 + 0 X 19^0 = 18 X 19^1 + 0 X 19^0= 18 X 19 + 0 X 1 =342

마찬가지로 parseInt("I11",19)결과는6518

  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.