web-dev-qa-db-ja.com

parseInt(1 / 0、19)が18を返すのはなぜですか?

JavaScriptに迷惑な問題があります。

> parseInt(1 / 0, 19)
> 18

parseInt関数が18を返すのはなぜですか?

848
cebor

1/0の結果は Infinity です。

parseInt は最初の引数を文字列として扱います。つまり、最初にInfinity.toString()が呼び出され、文字列"Infinity"が生成されます。そのため、基数19の"Infinity"を10進数に変換するように要求した場合と同じように機能します。

これは10進値と一緒に基数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)を呼び出した場合と同じように動作します。これは、上記の表で10進数の18に変換されます。

1282
Jon

これが一連のイベントです。

  • 1/0Infinityに評価されます
  • parseIntInfinityを読み、Iが基数19の18であることを喜んで注意しています
  • parseIntは変換できないため、文字列の残りの部分を無視します。

どの>= 19の基底に対しても結果が得られますが、それより下の基底では結果が得られません。基底>= 24の場合、nがその時点で有効な数字になるので、より大きな結果が得られます。

224
Craig Citro

上記の回答に追加するには:

parseIntは文字列を数値に解析することを目的としています(手掛かりは名前の中にあります)。あなたの状況では、1/0は既にすでに数なので、解析をしたくないので、これは奇妙な関数の選択です。あなたが(あなたがする)数を持っていて、それを特定の基数に変換したいのであれば、代わりに toStringを基数 と共に使うべきです。

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

上記の回答に追加するには

parseInt(1/0,19)parseInt("Infinity",19)と同等です

基数19内の0-9およびA-I(or a-i)は有効な数字です。したがって、「Infinity」から_19のIを取り、10に変換して18になります。次に、次の文字、つまり_19にないnを取得しようとするため、次の文字を破棄します(文字列を数値に変換するjavascriptの動作による)

したがって、parseInt("Infinity",19) OR parseInt("I",19) OR parseInt("i",19)と書くと、結果は同じになります(つまり18)。

parseInt("I0",19)と書くと、結果は342 as 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
13
Imdad