usar number float decimals decimales como javascript string-conversion

javascript - decimals - ¿Cuál es la diferencia entre Number(…) y parseFloat(…)



string to number javascript (5)

Cuando no se usa new para crear un objeto de envoltorio para un valor numérico, el Number se relega simplemente a hacer la conversión de tipo de cadena a número.

Por otra parte, ''parseFloat'', como mencionaste, puede analizar un número de punto flotante de cualquier cadena que comienza con un dígito, un decimal o +/-

Por lo tanto, si solo está trabajando con cadenas que contienen solo valores numéricos, Number(x) y parseFloat(x) resultarán en los mismos valores

¿Cuál es la diferencia entre parseInt (cadena) y Número (cadena) en JavaScript que se ha preguntado anteriormente?

Pero las respuestas se centraron básicamente en el radix y la capacidad de parseInt para tomar una cadena como "123htg" y convertirla en 123 .

Lo que estoy preguntando aquí es si hay una gran diferencia entre los retornos de Number(...) y parseFloat(...) cuando le pasas una cadena de número real sin ningún tipo de raíz.


El funcionamiento interno no es tan diferente, como ya respondió @James Allardic. Aunque hay una diferencia. Al usar parseFloat , una cadena (recortada) que comienza con uno o más caracteres numéricos seguidos por caracteres alfanuméricos se puede convertir en un Número, con un Number que no tendrá éxito. Como en:

parseFloat(''3.23abc''); //=> 3.23 Number(''3.23abc''); //=> NaN

En ambas conversiones, la cadena de entrada se recorta, por cierto:

parseFloat('' 3.23abc ''); //=> 3.23 Number('' 3.23 ''); //=> 3.23


No hay mucha diferencia, siempre y cuando estés seguro de que no hay más que dígitos en tu cadena. Si los hay, Number devolverá NaN .
Otro problema que podría obtener al usar el constructor de Number es que los compañeros de trabajo podrían pensar que olvidó la new palabra clave y agregarla más adelante, lo que provocará que las comparaciones estrictas no new Number(123) === 123 -> falso mientras que Number(123) === 123 -> verdadero.

En general, prefiero dejar el constructor de Number por lo que es, y solo usar la sintaxis más corta que existe para convertir a int / float: +numString , o usar parse* .


No. Ambos resultarán en que se ToNumber(string) la ToNumber(string) interna ToNumber(string) .

De la sección 15.7.1 de ES5 (el constructor de números llamado como una función):

Cuando se llama a Number como una función en lugar de como un constructor, realiza una conversión de tipos ...

Devuelve un valor de Número (no un objeto de Número) calculado por ToNumber(value) si se proporcionó el valor, de lo contrario, devuelve +0 .

De la sección 15.1.2.3 de ES5 (parseFloat (cadena)):

... Si ni trimmedString ni ningún prefijo de trimmedString satisfacen la sintaxis de un StrDecimalLiteral (ver 9.3.1) ...

Y ToNumber(string) es la sección titulada "ToNumber Applied to the String Type", a lo que se refiere la primera cita cuando dice ToNumber(value) .

Actualización (ver comentarios)

Al llamar al constructor de Number con el new operador, obtendrá una instancia del objeto Number , en lugar de un literal numérico. Por ejemplo:

typeof new Number(10); //object typeof Number(10); //number

Esto se define en la sección 15.7.2 (El constructor de números):

Cuando se llama a Number como parte de una new expresión, es un constructor: inicializa el objeto recién creado.


Por favor, disculpe la publicación de otra respuesta, pero acabo de llegar a través de una búsqueda en Google y no encontré todos los detalles que quería. Ejecutando el siguiente código en Node.js:

var vals = ["1", "1.1", "0", "1.1abc", "", " ", null]; for(var i = 0; i < vals.length; i++){ var ifTest = false; if(vals[i]) { ifTest = true; } console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest); }

da la siguiente salida:

val=1, Number()=1, parseFloat()=1, if()=true val=1.1, Number()=1.1, parseFloat()=1.1, if()=true val=0, Number()=0, parseFloat()=0, if()=true val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true val=, Number()=0, parseFloat()=NaN, if()=false val= , Number()=0, parseFloat()=NaN, if()=true val=null, Number()=0, parseFloat()=NaN, if()=false

Algunos puntos destacados:

  1. Si se protege con un if (val) antes de intentar convertir a un número, parseFloat () devolverá un número, excepto en el caso de espacios en blanco.
  2. Número devuelve un número en todos los casos, excepto los caracteres no numéricos, aparte del espacio en blanco.

Por favor, siéntase libre de agregar cualquier caso de prueba que pueda faltar.