Caminante
¿Puede redondear un número en JavaScript a un carácter después del punto decimal (redondeado correctamente)?
Probé el *10, round, /10, pero deja dos decimales al final del int.
billy luna
Math.round(num * 10) / 10
funciona, y aquí hay un ejemplo…
var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3
Si desea que tenga un lugar decimal, incluso cuando sería un 0, entonces agregue…
var fixed = rounded.toFixed(1)
// 'fixed' is always to one decimal point
// NOTE: .toFixed() returns a string!
// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros
// So, just make sure it is the last step before output,
// and use a number format during calculations!
Usando este principio, como referencia, aquí hay una función pequeña y práctica que requiere precisión…
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
… uso …
round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7
… por defecto redondea al número entero más cercano (precisión 0) …
round(12345.6789) // 12346
… y se puede usar para redondear al 10 o 100 más cercano, etc…
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
… y el manejo correcto de números negativos …
round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5
… y se puede combinar con toFixed para formatear consistentemente como una cadena …
round(456.7, 2).toFixed(2) // "456.70"
-
Tenga cuidado al usar
.toFixed()
ya que devuelve una cadena cuando tal vez quieras un número.– Cobby
14 de septiembre de 2012 a las 5:25
-
Genial, obviamente usando
parseFloat
eliminará los decimales dejados por.toFixed()
si es un número entero (ceros). En general, si desea hacer los cálculos, es mejor seguir su primer ejemplo. Si desea mostrar un número en su interfaz de usuario, utilice.toFixed()
.– Cobby
17 de septiembre de 2012 a las 1:12
-
Hmmm… eso tiene sentido, cualquier forma de convertir a número siempre debe eliminar los ceros erróneos, por lo que tiene que permanecer como una cadena. Supongo que siempre debe ser el último paso antes de la visualización y no debe usarse en los cálculos.
–Billy Luna
17 de septiembre de 2012 a las 10:22
-
Tenga cuidado al usar
.toFixed()
ya que podría devolver diferentes resultados de redondeo para diferentes navegadores. Leer esta publicación para detalles sobre el tema!– Marchitez
4 de marzo de 2014 a las 13:02
-
¿Puedo agregar un cero si no hay DP presentes?
– Nick
24 de noviembre de 2016 a las 12:34
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5
-
A veces
toFixed()
tiene fallas: lo he visto en un navegador Chrome donde llamotoFixed()
luego convertir a una cadena, y muestra algo como10.00000000068
– extraño. Sin embargo, no se puede reproducir esto de manera confiable.– Hamish Grubijan
25/04/2013 a las 21:45
-
Sí, contabilicé fallas con toFixed() incluso con solo unos pocos decimales. Redondeó la fracción 4 al siguiente número más alto en lugar de más bajo, si no recuerdo mal.
– Dalibor
30 de junio de 2015 a las 7:43
-
como lo menciona @cobby arriba: tenga cuidado al usar
.toFixed()
como devuelve unString
cuando tal vez quieras unNumber
– ricardo
25 de mayo de 2019 a las 0:41
jaspe de vries
Si utiliza Math.round(5.01)
conseguirás 5
en lugar de 5.0
.
Si utiliza toFixed
te encuentras con problemas de redondeo.
Si quieres lo mejor de ambos mundos, combina los dos:
(Math.round(5.01 * 10) / 10).toFixed(1)
Es posible que desee crear una función para esto:
function roundedToFixed(input, digits){
var rounder = Math.pow(10, digits);
return (Math.round(input * rounder) / rounder).toFixed(digits);
}
Kevinleary.net
Lodash tiene un round
método:
_.round(4.006);
// => 4
_.round(4.006, 2);
// => 4.01
_.round(4060, -2);
// => 4100
Oxidado
Simplemente puede hacer lo siguiente:
let n = 1.25
let result = Number(n).toFixed(1)
// output string: 1.3
Pedro Mortensen
yo voto por toFixed()
, pero, para que conste, aquí hay otra forma que usa el cambio de bits para convertir el número en un int. Por lo tanto, siempre se redondea hacia cero (hacia abajo para números positivos, hacia arriba para negativos).
var rounded = ((num * 10) << 0) * 0.1;
Pero bueno, dado que no hay llamadas de función, es increíblemente rápido. 🙂
Y aquí hay uno que usa coincidencia de cadenas:
var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');
No recomiendo usar la variante de cadena, solo digo.
Pedro Mortensen
Prueba con esto:
var original = 28.453
// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100 // Returns 28.45
// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10 // Returns 28.5
// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000 // Returns 8.111
Es menos complicado y más fácil de implementar…
Con esto, puedes crear una función para hacer:
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
function RoundAndFix (n, d) {
var m = Math.pow (10, d);
return Math.round (n * m) / m;
}
console.log (RoundAndFix(8.111111, 3));
Ver Cómo redondear usando ROUND HALF UP. Modo de redondeo que a la mayoría de nosotros nos enseñaron en la escuela primaria.
-
No: RoundAndFix(1.005, 2) .
– No yo
4 de diciembre de 2014 a las 17:56
-
Puede requerir Ctrl + Shift + J para mostrar el resultado (y permitir JavaScript desde
stacksnippets.net
)-Peter Mortensen
19 abr a las 10:00
Math.round(n * 10) / 10
funciona. ¿Cuál es tu código?– ben
8 de septiembre de 2011 a las 4:02
para su información developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
– Ray Toal
8 de septiembre de 2011 a las 4:06