with parse number javascript numbers parseint radix

javascript - number - parseint java



¿Por qué es parseInt(8,3)== NaN y parseInt(16,3)== 1? (2)

Estoy leyendo this pero estoy confundido por lo que está escrito en el análisis con un capítulo de argumento radix

¿Por qué es parseInt(8, 3)NaN y parseInt(16, 3)1 ?

AFAIK 8 y 16 no son números de base 3, por lo que parseInt(16, 3) debería devolver NaN


Esto es algo que la gente tropieza todo el tiempo, incluso cuando lo saben. :-) Estás viendo esto por la misma razón por la que parseInt("1abc") devuelve 1: parseInt detiene en el primer carácter no válido y devuelve lo que tenga en ese punto. Si no hay caracteres válidos para analizar, devuelve NaN .

parseInt(8, 3) significa "analizar "8" en la base 3" (tenga en cuenta que convierte el número 8 en una cadena; detalles en la especificación ). Pero en la base 3, los números de un solo dígito son solo 0 , 1 y 2 . Es como pedirle que analice "9" en octal. Como no había caracteres válidos, obtuviste NaN .

parseInt(16, 3) le pide que analice "16" en la base 3. Como puede analizar el 1 , lo hace, y luego se detiene en el 6 porque no puede analizarlo. Entonces devuelve 1 .

Dado que esta pregunta está recibiendo mucha atención y podría tener un alto puntaje en los resultados de búsqueda, aquí hay un resumen de opciones para convertir cadenas en números en JavaScript, con sus diversas idiosincrasias y aplicaciones (extraídas de otra respuesta mía aquí en SO):

  • parseInt(str[, radix]) - Convierte la mayor cantidad posible del comienzo de la cadena en un número entero (entero), ignorando los caracteres adicionales al final. Entonces parseInt("10x") es 10 ; la x se ignora. Admite un argumento opcional de radix (base de números), por lo que parseInt("15", 16) es 21 ( 15 en hexadecimal). Si no hay radix, asume decimal a menos que la cadena comience con 0x (o 0X ), en cuyo caso se omite y asume hexadecimal. (Algunos navegadores solían tratar cadenas que comienzan con 0 como octales; ese comportamiento nunca se especificó, y se rechazó específicamente en la especificación ES5). Devuelve NaN si no se encuentran dígitos analizables.

  • parseFloat(str) : al igual que parseInt , pero hace números de punto flotante y solo admite decimal. Nuevamente se ignoran los caracteres adicionales en la cadena, por lo que parseFloat("10.5x") es 10.5 (se ignora la x ). Como solo se admite el decimal, parseFloat("0x15") es 0 (porque el análisis termina en la x ). Devuelve NaN si no se encuentran dígitos analizables.

  • Unario + , por ejemplo, +str - (por ejemplo, conversión implícita) Convierte la cadena completa en un número utilizando coma flotante y la notación de números estándar de JavaScript (solo dígitos y un punto decimal = decimal; 0x prefijo = hex; 0o prefijo = octal [ES2015 +] ; algunas implementaciones lo extienden para tratar un 0 inicial como octal, pero no en modo estricto). +"10x" es NaN porque no se ignora la x . +"10" es 10 , +"10.5" es 10.5 , +"0x15" es 21 , +"0o10" es 8 [ES2015 +]. Tiene un problema: +"" es 0 , no NaN como es de esperar.

  • Number(str) : exactamente igual que la conversión implícita (por ejemplo, como el unario + anterior), pero más lenta en algunas implementaciones. (No es probable que importe).


Por la misma razón que

>> parseInt(''1foobar'',3) <- 1

En el documento , parseInt toma una cadena. Y

Si string no es una cadena, entonces se convierte en una cadena

Entonces 16 , 8 o ''1foobar'' se convierte primero en cadena.

Entonces

Si parseInt encuentra un carácter que no es un número en la raíz especificada, lo ignora y todos los caracteres siguientes

Lo que significa que se convierte hasta donde puede. Los 6 , 8 y foobar se ignoran, y solo se convierte lo anterior. Si no hay nada, se devuelve NaN .