web-dev-qa-db-fra.com

Pourquoi parseInt (1/0, 19) renvoie-t-il 18?

J'ai un problème ennuyeux en JavaScript.

> parseInt(1 / 0, 19)
> 18

Pourquoi la fonction parseInt renvoie-t-elle 18?

848
cebor

Le résultat de 1/0 est Infinity .

parseInt traite son premier argument comme une chaîne, ce qui signifie tout d'abord que Infinity.toString() est appelée, produisant la chaîne "Infinity". Donc, cela fonctionne comme si vous lui demandiez de convertir "Infinity" en base 19 en décimal.

Voici les chiffres en 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, c’est que parseInt analyse 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 n n’est pas un chiffre valide en base 19).

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

1284
Jon

Voici la séquence des événements:

  • 1/0 est évalué à Infinity
  • parseInt lit Infinity et note heureusement que I est égal à 18 en base 19
  • parseInt ignore le reste de la chaîne, car elle ne peut pas être convertie.

Notez que vous obtiendrez un résultat pour toute base >= 19, mais pas pour les bases inférieures. Pour les bases >= 24, vous obtiendrez un résultat plus grand, car n deviendra un chiffre valide à cet endroit.

224
Craig Citro

Pour ajouter aux réponses ci-dessus:

parseInt est destiné à analyser les chaînes en nombres (l'indice est dans le nom). Dans votre cas, vous ne voulez pas du tout analyser du tout, car 1/0 est déjà un nombre, donc c'est un choix de fonction étrange. Si vous avez un numéro (que vous avez) et que vous voulez le convertir en une base particulière, vous devez utiliser toString avec une base à la place.

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

Pour ajouter aux réponses ci-dessus

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

Dans la base 19, les chiffres 0-9 et A-I(or a-i) sont des nombres valides. Ainsi, à partir de "l'infini", il prend I de la base 19 et est converti en base 10, ce qui donne 18 ans. Il tente ensuite de prendre le caractère suivant, c'est-à-dire n, qui n'est pas présent en base 19; (selon le comportement de javascript consistant à convertir une chaîne en nombre)

Ainsi, si vous écrivez parseInt("Infinity",19) OR parseInt("I",19) OR 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) donnera 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
13
Imdad