863 votes

Pourquoi ne parseInt(1/0, 19) de retour de 18 ans?

J'ai un problème ennuyeux en JavaScript.

parseInt(1 / 0, 19)
18

Pourquoi est - parseInt rendement 18?

1304voto

Jon Points 194296

Le résultat de l' 1/0 est Infinity.

parseInt traite son premier argument est une chaîne de caractères qui signifie tout d'abord Infinity.toString() est appelé, la production de la chaîne "Infinity". De sorte qu'il fonctionne de la même manière que si vous avez demandé à convertir "Infinity" dans la base de 19 à virgule.

Voici les chiffres de la base de 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 qu' parseInt analyse l'entrée en "Infinity" de trouver la partie qui peut être analysé et s'arrête après l'acceptation de la première I (parce qu' n n'est pas valide chiffres en base 19).

Par conséquent, il se comporte comme si vous appeliez parseInt("I", 19), ce qui le convertit en décimal 18 par le tableau ci-dessus.

229voto

Craig Citro Points 2535

Voici la séquence des événements:

  • 1/0 évalue Infinity
  • parseInt lectures Infinity et heureusement notes qu' I à 18 ans dans la base de 19
  • parseInt ignore le reste de la chaîne, car il ne peut pas être converti.

Notez que vous obtenez un résultat de n'importe quelle base >= 19, mais pas pour les bases ci-dessous. Pour les bases >= 24, vous obtiendrez un plus grand résultat, n devient valide chiffres à ce point.

39voto

kybernetikos Points 3127

À 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 le faire toute l'analyse à tous depuis 1/0 est déjà un certain nombre, donc c'est un choix étrange de la fonction. Si vous avez un nombre (qui vous le faire) et que vous voulez convertir à un particulier de base, vous devez utiliser toString avec un radix à la place.

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"

14voto

Imdad Points 2904

À ajouter aux réponses ci-dessus

parseInt(1/0,19) est équivalent à parseInt("Infinity",19)

Au sein de la base de 19 nombre 0-9 et A-I (or a-i) sont de numéros valides. Donc, à partir de la "Infinity" il faut I de la base de 19 et les convertit en base 10 qui devient 18 Ensuite, il tente de prendre le prochain caractère, c'est à dire n ce qui n'est pas présent dans la base de 19 les rejets prochaine caractères (comme par javascript du comportement de la conversion de chaîne de caractères pour le nombre)

Ainsi, si vous écrivez parseInt("Infinity",19) OU parseInt("I",19) OU parseInt("i",19) le résultat sera le même et je.e 18.

Maintenant, si vous écrivez parseInt("I0",19) le résultat sera 342 en tant que 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înera 6518

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X