JavaScriptに迷惑な問題があります。
> parseInt(1 / 0, 19)
> 18
parseInt
関数が18
を返すのはなぜですか?
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に変換されます。
これが一連のイベントです。
1/0
はInfinity
に評価されますparseInt
はInfinity
を読み、I
が基数19の18であることを喜んで注意していますparseInt
は変換できないため、文字列の残りの部分を無視します。どの>= 19
の基底に対しても結果が得られますが、それより下の基底では結果が得られません。基底>= 24
の場合、n
がその時点で有効な数字になるので、より大きな結果が得られます。
上記の回答に追加するには:
parseIntは文字列を数値に解析することを目的としています(手掛かりは名前の中にあります)。あなたの状況では、1/0は既にすでに数なので、解析をしたくないので、これは奇妙な関数の選択です。あなたが(あなたがする)数を持っていて、それを特定の基数に変換したいのであれば、代わりに toStringを基数 と共に使うべきです。
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
上記の回答に追加するには
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