cibermosca
Quiero usar Javascript para redondear un número. Dado que el número es moneda, quiero que se redondee como en estos ejemplos (2 puntos decimales):
- 192.168 => 192.20
- 192.11 => 192.20
- 192.21 => 192.30
- 192.26 => 192.30
- 192.20 => 192.20
¿Cómo lograr esto usando Javascript? La función incorporada de Javascript redondeará el número según la lógica estándar (menos y más de 5 para redondear).
andres marshall
/**
* @param num The number to round
* @param precision The number of decimal places to preserve
*/
function roundUp(num, precision) {
precision = Math.pow(10, precision)
return Math.ceil(num * precision) / precision
}
roundUp(192.168, 1) //=> 192.2
-
@AndrewMarshall, ¿cuál es el propósito de multiplicar y luego dividir por 10?
– código vaquero
7 de enero de 2013 a las 18:23
-
@codecowboy Si no lo hace, entonces
ceil()
Te regalaré193
, por lo que debemos asegurarnos de que toda la precisión que queremos mantener sea antes del punto decimal. Luego hacemos la operación inversa para restaurar el valor “original”.– Andrés Marshall
7 de enero de 2013 a las 23:22
-
Si obtienes un número como
192.19999999999997
puedes aplicar.toFixed(1)
hacianum
– flamer.ohr
8 de marzo de 2016 a las 2:37
-
Y para aquellos aquí que se preguntan cómo redondear al número ENTERO más cercano, solo necesitan Math.ceil(). El resto es sólo para tratar con decimales. ¡Para salvar a otros el tiempo que le tomó a mi cerebro llegar a eso!
– usuario2493235
30 de abril de 2016 a las 10:59
-
¡CUIDADO ESTA FUNCIÓN NO ES TOTALMENTE PRECISA! roundUp(1.09, 2) devuelve 1.1 que es incorrecto. La respuesta esperada es 1.09 todavía.
– Igual
12 mayo 2020 a las 21:28
El redondeo normal funcionará con un pequeño ajuste:
Math.round(price * 10)/10
y si desea mantener un formato de moneda, puede usar el método Número .toFixed()
(Math.round(price * 10)/10).toFixed(2)
Aunque esto lo convertirá en una cadena =)
-
Ronda matemática (192.11 * 100)/100 -> 192.11
– krtek
4 de marzo de 2011 a las 7:57
-
El segundo no necesita redondeo, es más como
price.toFixed(2)
– Michael Krelin – hacker
4 de marzo de 2011 a las 7:58
-
@Krtek ooops, gracias por captar eso. Leí mal la pregunta. Respuesta actualizada.
– Sábalo
4 de marzo de 2011 a las 7:59
-
El OP preguntó cómo redondear un número, por lo que Math.ceil debería usarse aquí en lugar de Math.round.
– kloddant
4 de abril de 2016 a las 13:38
suryakiran
Un poco tarde, pero puede crear una función javascript reutilizable para este propósito:
// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) {
var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
return newnumber;
}
Llame a la función como
alert(roundNumber(192.168,2));
-
Esto funciona muy bien, pero el OP preguntó cómo redondear un número, por lo que Math.ceil debería usarse aquí en lugar de Math.round.
– kloddant
4 de abril de 2016 a las 14:02
-
Esta respuesta es mejor que la respuesta aceptada si está buscando redondear correctamente a pesar del lugar decimal al que apunta. Ej: 1,054 –> 1,05 1,055 –> 1,06 SIN EMBARGO aquí hay un caso límite: 1,005 –> 1 1,006 –> 1,01 Y 1,015 –> 1,01 1,016 –> 1,02 Así que ten cuidado.
– Jay K.
1 de marzo de 2017 a las 4:41
Hoang Long
muy cerca de El ojo respuesta, pero cambio una pequeña cosa para que funcione:
var num = 192.16;
console.log( Math.ceil(num * 10) / 10 );
El OP espera dos cosas:
A. para redondear a los décimos superiores, y
B. para mostrar un cero en el lugar de las centésimas (una necesidad típica con la moneda).
El cumplimiento de ambos requisitos parece requerir un método separado para cada uno de los anteriores. Aquí hay un enfoque que se basa en la respuesta sugerida por suryakiran:
//Arguments: number to round, number of decimal places.
function roundPrice(rnum, rlength) {
var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
var toTenths = newnumber.toFixed(rlength);
return toTenths;
}
alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60
Nota importante: esta solución produce un resultado muy diferente con números negativos y exponenciales.
En aras de la comparación entre esta respuesta y dos que son muy similares, consulte los siguientes 2 enfoques. El primero simplemente redondea a la centésima más cercana como de costumbre, y el segundo simplemente redondea a la centésima más cercana (más grande).
function roundNumber(rnum, rlength) {
var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
return newnumber;
}
alert(roundNumber(678.91011,2)); // returns 678.91
function ceilNumber(rnum, rlength) {
var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
return newnumber;
}
alert(ceilNumber(678.91011,2)); // returns 678.92
zhulien
ok, esto ha sido respondido, pero pensé que te gustaría ver mi respuesta que llama al math.pow()
funcionar una vez. Supongo que me gusta mantener las cosas SECA.
function roundIt(num, precision) {
var rounder = Math.pow(10, precision);
return (Math.round(num * rounder) / rounder).toFixed(precision)
};
De alguna manera lo pone todo junto. Reemplazar Math.round()
con Math.ceil()
para redondear en lugar de redondear, que es lo que quería el OP.
Behnam
esta función limita decimal sin número redondo
function limitDecimal(num,decimal){
return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}
-
Como alternativa más corta: return ( ” + num ).split(‘.’).shift()
– Yogui
27 de noviembre de 2015 a las 20:49
-
gracias Roberto este código funciona, pero elimina todos los decimales
– Behnam
29 de noviembre de 2015 a las 7:31