hacia - redondear decimales javascript
¿Cómo puedo redondear un número en JavaScript?.toFixed() devuelve una cadena? (9)
¿Me estoy perdiendo de algo?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
¿ Por qué .toFixed()
devuelve una cadena?
Quiero redondear el número a 2 dígitos decimales.
¿Por qué no usar parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
¿Porque su uso principal es mostrar números? Si desea redondear números, use Math.round()
con factores apropiados.
¿Qué esperarías que vuelva cuando se supone que debe formatear un número? Si tienes un número, no puedes hacer nada con él porque, por ejemplo, 2 == 2.0 == 2.00
etc., así que tiene que ser una cadena.
Devuelve una cadena porque 0.1, y sus potencias (que se usan para mostrar fracciones decimales), no son representables (al menos no con total precisión) en sistemas binarios de coma flotante.
Por ejemplo, 0.1 es realmente 0.1000000000000000055511151231257827021181583404541015625, y 0.01 es realmente 0.01000000000000000020816681711721685132943093776702880859375. (Gracias a BigDecimal
por probar mi punto. :-P)
Por lo tanto, (si no hay un punto flotante decimal o un número de número racional), sacarlo como una cadena es la única forma de recortarla exactamente a la precisión requerida para la visualización.
He resuelto este problema cambiando esto:
someNumber = someNumber.toFixed(2)
...a esto:
someNumber = +someNumber.toFixed(2);
Sin embargo, esto convertirá el número en una cadena y lo analizará de nuevo, lo que tendrá un impacto significativo en el rendimiento. Si le importa el rendimiento o la seguridad de tipo, revise las otras respuestas también.
Lo resolví convirtiéndolo de nuevo al número usando la función Number()
JavaScript
var x = 2.2873424;
x = Number(x.toFixed(2));
Por supuesto, devuelve una cadena. Si quisieras redondear la variable numérica, usarías Math.round () en su lugar. El punto de to Fixed es formatear el número con un número fijo de decimales para mostrar al usuario .
Simplemente puede usar un ''+'' para convertir el resultado en un número.
var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
Number.prototype.toFixed
es una función diseñada para formatear un número antes de imprimirlo. Es de la familia de toString
, toExponential
y toPrecision
.
Para redondear un número, harías esto:
someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;
// if you need 3 digits, replace 1e2 with 1e3 etc.
.
O si desea una función nativa , aquí está:
Number.prototype.toFixedNumber = function(x, base){
var pow = Math.pow(base||10,x);
return +( Math.round(this*pow) / pow );
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;
//or even hexadecimal
someNumber = 0xAF309/256 //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";
.
Aunque no me gusta mucho jsperf, aquí hay un enlace con la comparación del método que usa la conversión (en otras respuestas) y este:
https://jsperf.com/rounding-a-number-2