JavaScriptに厄介な問題があります。
> parseInt(1 / 0, 19)
> 18
parseInt関数が を返すのはなぜ18ですか?
JavaScriptに厄介な問題があります。
> parseInt(1 / 0, 19)
> 18
parseInt関数が を返すのはなぜ18ですか?
の結果は1/0ですInfinity。
parseInt最初の引数を文字列として扱います。これは、最初にInfinity.toString()呼び出され、文字列を生成することを意味します"Infinity"。"Infinity"したがって、 19を底として10進数に変換するように要求した場合と同じように機能します。
基数19の数字とその10進値は次のとおりです。
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"解析できる部分を見つけ、最初の部分を受け入れた後に停止することです(ベース19の有効な数字ではないIため)。n
したがって、を呼び出したかのように動作しparseInt("I", 19)、上記の表で10進数の18に変換されます。
イベントのシーケンスは次のとおりです。
1/0に評価されますInfinityparseInt19 進法で 18 であることを読みInfinity、喜んでメモします。IparseInt変換できないため、文字列の残りの部分は無視されます。base の結果は得られますが>= 19、それより下の base の結果は得られないことに注意してください。basesの場合、その時点で有効な数字になる>= 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)、有効な数値です。したがって、「無限大」からI基数 19 を取得し、基数 10 に変換して 18 になります。次に、基数 19 に存在しない次の文字を取得しようとします。次の文字nを破棄します (文字列を数値に変換する JavaScript の動作に従って) )
したがって、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