Pregunta ¿Por qué parseInt (1/0, 19) devuelve 18?


Tengo un problema molesto en JavaScript.

> parseInt(1 / 0, 19)
> 18

Por que parseInt regreso 18?


830
2017-07-05 08:37


origen


Respuestas:


El resultado de 1/0 es Infinity.

parseInt trata su primer argumento como una cadena que significa ante todo Infinity.toString() se llama, produciendo la cadena "Infinity". Entonces funciona igual que si le pidieras convertir "Infinity" en la base 19 a decimal.

Aquí están los dígitos en la base 19 junto con sus valores decimales:

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

Lo que sucede a continuación es que parseInt escanea la entrada "Infinity" para encontrar qué parte de él se puede analizar y se detiene después de aceptar el primero I (porque n no es un dígito válido en la base 19).

Por lo tanto, se comporta como si llamaras parseInt("I", 19), que se convierte a decimales 18 en la tabla anterior.


1270
2017-07-05 08:41



Aquí está la secuencia de eventos:

  • 1/0 evalúa a Infinity
  • parseInt lee Infinity y felizmente nota que I es 18 en la base 19
  • parseInt ignora el resto de la cadena, ya que no se puede convertir.

Tenga en cuenta que obtendrá un resultado para cualquier base >= 19, pero no para bases debajo de eso. Para bases >= 24, obtendrás un resultado más grande, como n se convierte en un dígito válido en ese punto.


221
2017-07-05 08:43



Para agregar a las respuestas anteriores:

parseInt está destinado a analizar cadenas en números (la clave está en el nombre). En su situación, no desea hacer ningún análisis en absoluto ya que 1/0 es ya un número, por lo que es una extraña elección de función. Si tiene un número (que lo hace) y desea convertirlo a una base particular, debe usar toString con una raíz en lugar.

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

34
2017-07-10 15:54



Para agregar a las respuestas anteriores

parseInt(1/0,19) es equivalente a parseInt("Infinity",19)

Dentro de la base 19 números 0-9 y A-I  (or a-i) son un número válido Entonces, desde el "Infinito" toma I de base 19 y se convierte a la base 10 que se convierte en 18 Luego intenta tomar el siguiente personaje, es decir n que no está presente en la base 19, por lo que descarta los siguientes caracteres (según el comportamiento de javascript de convertir cadena en número)

Entonces, si escribes parseInt("Infinity",19) O parseInt("I",19) O parseInt("i",19) el resultado será el mismo, es decir, 18.

Ahora, si escribes parseInt("I0",19) el resultado será 342 como 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

Similar, parseInt("I11",19) resultará en 6518

es decir

  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