J'ai un problème gênant en JavaScript .
> parseInt(1 / 0, 19)
> 18
Pourquoi la parseInt
fonction revient-elle 18
?
J'ai un problème gênant en JavaScript .
> parseInt(1 / 0, 19)
> 18
Pourquoi la parseInt
fonction revient-elle 18
?
Réponses:
Le résultat de 1/0
est Infinity
.
parseInt
traite son premier argument comme une chaîne, ce qui signifie que tout d'abord Infinity.toString()
est appelé, produisant la chaîne "Infinity"
. Il fonctionne donc de la même manière que si vous lui aviez demandé de convertir "Infinity"
en base 19 en décimal.
Voici les chiffres de la base 19 avec leurs valeurs décimales:
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
Ce qui se passe ensuite est que parseInt
balaye l'entrée "Infinity"
pour trouver quelle partie de celle-ci peut être analysée et s'arrête après avoir accepté le premier I
(car ce n
n'est pas un chiffre valide dans la base 19).
Par conséquent, il se comporte comme si vous appeliez parseInt("I", 19)
, ce qui se transforme en décimal 18 par le tableau ci-dessus.
parseInt('Infini',24)
.
n
est également un chiffre valide, il finit par le faire parseInt("Infini", 24)
.
Voici la séquence des événements:
1/0
évalue à Infinity
parseInt
lit Infinity
et note avec bonheur qui I
est de 18 en base 19parseInt
ignore le reste de la chaîne, car elle ne peut pas être convertie.Notez que vous obtiendrez un résultat pour n'importe quelle base >= 19
, mais pas pour les bases en dessous. Pour les bases >= 24
, vous obtiendrez un résultat plus grand, car il n
devient un chiffre valide à ce stade.
parseInt
acceptera est 36, car il y a 26 lettres dans l'alphabet anglais, et la convention est d'utiliser des chiffres puis des lettres comme ensemble de chiffres valides dans la base donnée.
Infinity
à "Infinity"
...
Pour ajouter aux réponses ci-dessus:
parseInt est destiné à analyser les chaînes en nombres (l'indice est dans le nom). Dans votre situation, vous ne voulez pas du tout analyser car 1/0 est déjà un nombre, c'est donc un choix de fonction étrange. Si vous avez un nombre (ce que vous faites) et que vous souhaitez le convertir en une base particulière, vous devez plutôt utiliser toString avec un radix .
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Pour ajouter aux réponses ci-dessus
parseInt(1/0,19)
est équivalent à parseInt("Infinity",19)
Dans la base 19 numéros 0-9
et A-I
(or a-i)
sont des numéros valides. Donc, à partir de "l'infini", il prend I
de la base 19 et se convertit en base 10 qui devient 18 Ensuite, il essaie de prendre le caractère suivant, c'est-à-dire n
qui n'est pas présent en base 19, donc il rejette les caractères suivants (selon le comportement de javascript de la conversion de la chaîne en nombre )
Donc, si vous écrivez parseInt("Infinity",19)
OU parseInt("I",19)
OU parseInt("i",19)
le résultat sera le même, c'est-à-dire 18
.
Maintenant, si vous écrivez, parseInt("I0",19)
le résultat sera 342
comme 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
De même, parseInt("I11",19)
entraînera6518
c'est à dire
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
if
pourrait aider.