Question Pourquoi parseInt (1/0, 19) renvoie 18?


J'ai un problème ennuyant en JavaScript.

> parseInt(1 / 0, 19)
> 18

Pourquoi parseInt revenir 18?


830
2017-07-05 08:37


origine


Réponses:


Le résultat de 1/0 est Infinity.

parseInt traite son premier argument comme une chaîne qui signifie tout d'abord Infinity.toString() est appelé, produisant la chaîne "Infinity". Donc, cela fonctionne comme si vous le demandiez 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

Qu'est-ce qui se passe ensuite est que parseInt analyse l'entrée "Infinity" pour trouver quelle partie de celui-ci peut être analysé et s'arrête après avoir accepté le premier I (car n n'est pas un chiffre valide dans la base 19).

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


1270
2017-07-05 08:41



Voici la séquence des événements:

  • 1/0 évalue à Infinity
  • parseInt lit Infinity et note avec bonheur que I est 18 dans la base 19
  • parseInt ignore le reste de la chaîne, car il ne peut pas être converti.

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 important, comme n devient un chiffre valide à ce moment-là.


221
2017-07-05 08:43



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 faire d'analyse du tout puisque 1/0 est déjà un nombre, donc c'est un étrange choix de fonction. Si vous avez un nombre (que vous faites) et que vous voulez le convertir en une base particulière, vous devez utiliser toString avec une base au lieu.

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

34
2017-07-10 15:54



Pour ajouter aux réponses ci-dessus

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

Dans les numéros de base 19 0-9 et A-I  (or a-i) sont des nombres valides. Donc, à partir de "l'Infini" il faut I de base 19 et convertit en base 10 qui devient 18 Ensuite, il essaie de prendre le personnage suivant, c'est-à-dire n qui n'est pas présent dans la base 19, donc rejette les caractères suivants (selon le comportement de javascript de convertir 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 i.e 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) aura pour résultat 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

11
2017-07-17 08:01