¿Cómo puedo redondear un número en JavaScript?.toFixed () devuelve una cadena?


¿Me estoy perdiendo algo aquí?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

por Qué ¿.toFixed() return una cadena?

Quiero redondear el número a 2 dígitos decimales.

Author: Cheeso, 2010-02-17

11 answers

Devuelve una cadena porque 0.1, y sus potencias (que se utilizan 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.10000000000000000000055511151231257827021181583404541015625, y 0.01 es realmente 0,010000000000000000020816681711721685132943093776702880859375. (Gracias a BigDecimal por probar mi punto. :- P)

Por lo tanto (ausente un punto flotante decimal o un tipo de número racional), la salida como una cadena es la única manera de conseguir que se recorta exactamente a la precisión requerida para la visualización.

 94
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-17 19:16:58

Number.prototype.toFixed es una función diseñada para formato un número antes de imprimir. Es de la familia de toString, toExponential y toPrecision.

Para redondear un número, usted haría 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 otros respuestas) y éste:
https://jsperf.com/rounding-a-number-2

 101
Author: m93a,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-25 09:59:29

He resuelto este problema cambiando esto:

someNumber = someNumber.toFixed(2)

To 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 te preocupa el rendimiento o la seguridad del tipo, revisa las otras respuestas también.

 96
Author: Eve juan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-15 12:04:36

¿por Qué no usar parseFloat?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
 20
Author: sirlunchalot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-13 09:50:03

Por supuesto devuelve una cadena. Si quisieras redondear la variable numérica usarías Matemáticas.round () en su lugar. El punto de toFixed es formatear el número con un número fijo de decimales para mostrar al usuario.

 13
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-17 19:41:34

Lo resolví convirtiéndolo de nuevo en número usando la función Number() de JavaScript

var x = 2.2873424;
x = Number(x.toFixed(2));
 11
Author: Nizar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 11:13:24

¿Qué esperarías que volviera cuando se supone que formatee 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 cuerda.

 3
Author: Tomas Vana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-17 19:04:52

Simplemente puede usar un '+' para convertir el resultado en un número.

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
 3
Author: meisam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 13:34:51

¿Porque su uso principal es mostrar números? Si desea redondear números, utilice Math.round() con los factores apropiados.

 1
Author: Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-17 19:05:25

Aquí hay una versión un poco más funcional de la respuesta m93a proporcionada.

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12
 0
Author: Sartaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 00:22:08

Para proporcionar un ejemplo de por qué tiene que ser una cadena:

Si formatea 1.toFixed (2) obtendrías '1.00'.

Esto no es lo mismo que 1, ya que 1 no tiene 2 decimales.


Sé que JavaScript no es exactamente un lenguaje de rendimiento , pero es probable que obtenga un mejor rendimiento para un redondeo si usa algo como: roundedValue = Math.ronda(valor * 100) * 0.01

 0
Author: Pyro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 15:18:36