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


853

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

> parseInt(1 / 0, 19)
> 18

なぜparseInt関数は戻るの18ですか?


3
面白い。しかし、なぜこれがあなたにとって厄介な問題なのでしょうか?Infinityを他の方法で処理する必要がありますか?もしそうなら、if助けになるかもしれません。
ティロ

254
19桁の数値またはゼロによる除算のいずれかを使用する必要があるなんて一体一体何をしていたのですか。
ジャックM

19
JSについて混乱したら、この引用に戻って、いまいましい言語全体が10日未満で設計および実装されたことを思い出してください(それを行った人によると)。
tylerl 2012

32
FAQから:「あなたが直面している実際の問題に基づいて、実用的で答えられる質問をするべきです。」これは、実際に直面する「厄介な問題」ではなく、インターネット上で永遠に浮かんでいる非現実的な例です
Jeremy Banks、

2
pythonも同じことを行います:int( 'I'、19)== 18
oberhamsi

回答:


1292

の結果は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"をスキャンして、解析できる部分を見つけ、最初の部分を受け入れた後に停止するIことnです(ベース19の有効な数字ではないため)。

したがって、これはを呼び出した場合と同様に動作し、parseInt("I", 19)上記の表で10進数の18に変換されます。


32
@mithunsatheeshお試しくださいparseInt('Infini',24)
2012

112
@mithunsatheesh:ベース24 nも有効な数字なので、実際にはを使用してしまいparseInt("Infini", 24)ます。
Jon

36
なぜ誰かがこのように振る舞う言語で「プログラミング」したいのかは、私を超えています。
Frans Bouma

45
@FransBouma:JSはそれなりに美しいです。そして、実際、ここで何が起きても、動的言語で不当なことはありません。
2012

59
@ジョン:このアーティファクトは動的言語の結果ではありません。それはルーズタイピングの結果です。厳密に型指定された動的言語では、この種の愚かさを防ぐために、無限(float)から「無限」(string)への暗黙的な変換は行われません。
ライライアン

225

イベントのシーケンスは次のとおりです。

  • 1/0 評価する Infinity
  • parseIntベース19の18を読んInfinityで楽しくメモI
  • parseInt 文字列は変換できないため、残りの文字列は無視されます。

どのbaseでも結果が得られます>= 19が、それより下のbase では得られないことに注意してください。basesの>= 24場合n、その時点で有効な数字になるため、より大きな結果が得られます。


それはなぜ@Thiloところで、何が理由だろう可能性があるベースの大きい場合には、19で停止しますか?JSが解釈できる最大のベースは何ですか?
Arnthor、2012

4
@Nordvind parseInt受け入れられる最大のベースは36です。これは、英語のアルファベットに26文字あるため、指定されたベースの有効な数字のセットとして数字と文字の組み合わせを使用することです。
クレイグシトロ

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-9A-I (or a-i)有効数字です。したがって、「Infinity」からはI19を基数として10に変換され、18になります。次に、n19に存在しない次の文字を取得しようとします。つまり、基数19に存在しないため、次の文字を破棄します(文字列を数値に変換するJavaScriptの動作に従って) )

したがって、parseInt("Infinity",19)OR 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.