with valores texto numero number isnan convertir comprobar javascript parseint

javascript - valores - ¿Por qué parseInt(1/0, 19) devuelve 18?



parseint javascript (4)

Tengo un problema molesto en JavaScript.

> parseInt(1 / 0, 19) > 18

¿Por qué parseInt devuelve 18 ?


Aquí está la secuencia de eventos:

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

Tenga en cuenta que obtendría un resultado para cualquier base >= 19 , pero no para las bases debajo de eso. Para bases >= 24 , obtendrá un resultado mayor, ya que n convierte en un dígito válido en ese punto.


El resultado de 1/0 es Infinity .

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

Aquí están los dígitos en 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 se puede analizar y se detiene después de aceptar la primera I (porque n no es un dígito válido en la base 19).

Por lo tanto, se comporta como si llamara parseInt("I", 19) , que se convierte al decimal 18 en la tabla de arriba.


Para añadir a las respuestas anteriores.

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

Dentro de la base, los números 0-9 y AI (or ai) son números válidos. Entonces, desde el "Infinito" toma I de base 19 y se convierte en base 10 que se convierte en 18 Luego intenta tomar el siguiente carácter, es decir, n que no está presente en la base 19, así que descarta los siguientes caracteres (según el comportamiento de javascript de la cadena de conversión Al numero)

Por lo tanto, si escribe parseInt("Infinity",19) O parseInt("I",19) O parseInt("i",19) el resultado será el mismo, es decir, 18 .

Ahora, si escribe parseInt("I0",19) el resultado será 342 como IX 19 (the base)^1 + 0 X 19^0 = 18 X 19^1 + 0 X 19^0 = 18 X 19 + 0 X 1 = 342

De manera 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


Para agregar a las respuestas anteriores:

parseInt está destinado a analizar cadenas en números (la pista está en el nombre). En su situación, no desea realizar ningún análisis ya que 1/0 ya es un número, por lo que es una opción de función extraña. Si tienes un número (lo que tienes) y quieres convertirlo en una base en particular, deberías usar toString con un radix .

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