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
に評価されますInfinity
parseInt
19 進法で 18 であることを読みInfinity
、喜んでメモします。I
parseInt
変換できないため、文字列の残りの部分は無視されます。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