redondear - ¿Cómo redondeas al primer decimal en Javascript?
parsefloat javascript 2 decimales (19)
ES 6 Versión de respuesta aceptada:
function round(value, precision) {
const multiplier = 10 ** (precision || 0);
return Math.round(value * multiplier) / multiplier;
}
¿Puede redondear un número en javascript a 1 carácter después del punto decimal (correctamente redondeado)?
Probé el * 10, round, / 10 pero deja dos decimales al final del int.
En general, el redondeo se realiza escalando: round(num / p) * p
Usar la notación exponencial maneja el redondeo de números + ve, correctamente. Sin embargo, este método no puede redondear los casos de borde correctamente.
function round(num, precision = 2) {
var scaled = Math.round(num + "e" + precision);
return Number(scaled + "e" + -precision);
}
// testing some edge cases
console.log( round(1.005, 2) ); // 1.01 correct
console.log( round(2.175, 2) ); // 2.18 correct
console.log( round(5.015, 2) ); // 5.02 correct
console.log( round(-1.005, 2) ); // -1 wrong
console.log( round(-2.175, 2) ); // -2.17 wrong
console.log( round(-5.015, 2) ); // -5.01 wrong
Aquí, también hay una función que escribí para hacer el redondeo aritmético, puedes probarlo tú mismo.
/**
* MidpointRounding away from zero (''arithmetic'' rounding)
* Uses a half-epsilon for correction. (This offsets IEEE-754
* half-to-even rounding that was applied at the edge cases).
*/
function RoundCorrect(num, precision = 2) {
// half epsilon to correct edge cases.
var c = 0.5 * Number.EPSILON * num;
// var p = Math.pow(10, precision); //slow
var p = 1; while (precision--> 0) p *= 10;
if (num < 0)
p *= -1;
return Math.round((num + c) * p) / p;
}
// testing some edge cases
console.log(RoundCorrect(1.005, 2)); // 1.01 correct
console.log(RoundCorrect(2.175, 2)); // 2.18 correct
console.log(RoundCorrect(5.015, 2)); // 5.02 correct
console.log(RoundCorrect(-1.005, 2)); // -1.01 correct
console.log(RoundCorrect(-2.175, 2)); // -2.18 correct
console.log(RoundCorrect(-5.015, 2)); // -5.02 correct
Encontré una manera de evitar los problemas de precisión:
function badRound (num, precision) {
const x = 10 ** precision;
return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1
function round (num, precision) {
const x = 10 ** (precision + 1);
const y = 10 ** precision;
return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01
Esto parece funcionar de manera confiable a través de cualquier cosa que le lance:
function round(val, multiplesOf) {
var s = 1 / multiplesOf;
var res = Math.ceil(val*s)/s;
res = res < val ? res + multiplesOf: res;
var afterZero = multiplesOf.toString().split(".")[1];
return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}
Se redondea, por lo que es posible que deba modificarlo según el caso de uso. Esto debería funcionar:
console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
Hice uno que devuelve el tipo de número y también coloca decimales solo si son necesarios (sin relleno 0).
Ejemplos:
roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10
roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9
El código:
function roundWithMaxPrecision (n, precision) {
return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}
Intenta 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
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));
EDITAR : ver este Cómo redondear utilizando la MITAD REDONDO. Modo de redondeo que la mayoría de nosotros aprendimos en la escuela primaria
Para completar la mejor respuesta:
var round = function ( number, precision )
{
precision = precision || 0;
return parseFloat( parseFloat( number ).toFixed( precision ) );
}
El número de parámetro de entrada puede "no" ser siempre un número, en este caso .toFixed no existe.
Poco filtro angular si alguien lo quiere:
angular.module(''filters'').filter(''decimalPlace'', function() {
return function(num, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(num * multiplier) / multiplier;
};
});
utilizar si a través de:
{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}
:)
Si su método no funciona, por favor publique su código.
Sin embargo, podría realizar la tarea de redondeo como:
var value = Math.round(234.567*100)/100
Te daré 234.56
similar
var value = Math.round(234.567*10)/10
Dara 234.5
De esta manera, puede usar una variable en lugar de la constante como se usó anteriormente.
Si te interesa el redondeo adecuado entonces:
function roundNumericStrings(str , numOfDecPlacesRequired){
var roundFactor = Math.pow(10, numOfDecPlacesRequired);
return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString(); }
Si no, entonces ya tienes una respuesta de publicaciones anteriores.
str.slice(0, -1)
Si usas Math.round(5.01)
obtendrás 5
lugar de 5.0
.
Si usas a toFixed
te encuentras con issues rounding .
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(_float, _digits){
var rounder = Math.pow(10, _digits);
return (Math.round(_float * rounder) / rounder).toFixed(_digits);
}
Yo voto por toFixed()
, pero, para el registro, aquí hay otra manera que usa el desplazamiento de bits para convertir el número a un int. Por lo tanto, siempre se redondea hacia cero (hacia abajo para números positivos, para negativos).
var rounded = ((num * 10) << 0) * 0.1;
Pero bueno, ya que no hay llamadas a funciones, es muy rápido. :)
Y aquí hay uno que utiliza la coincidencia de cadenas:
var rounded = (num + '''').replace(/(^.*?/d+)(/./d)?.*/, ''$1$2'');
No recomiendo usar la variante de cadena, solo digo.
x = número, n = lugares decimales:
function round(x, n) {
return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
Math.round( num * 10) / 10
funciona, aquí hay un ejemplo ...
var number = 12.3456789;
var rounded = Math.round( number * 10 ) / 10;
// rounded is 12.3
si quieres que tenga un lugar decimal, incluso cuando sea un 0, entonces agrega ...
var fixed = rounded.toFixed(1);
// fixed is always to 1dp
// BUT: returns string!
// to get it 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!
EDITAR: añadir ronda con función de precisión ...
Usando este principio, como referencia, aquí hay una pequeña función práctica que toma 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 redondear al número entero más cercano (precisión 0) ...
round(12345.6789) // 12346
... y se puede usar para redondear a las 10 o 100 más cercanas, etc.
round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300
... y correcto manejo 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 cadena ...
round(456.7, 2).toFixed(2) // "456.70"
Math.round( num * 10) / 10
no funciona.
Por ejemplo, 1455581777.8-145558160.4
le da 1310023617.3999999
.
Entonces solo use num.toFixed(1)
Math.round( mul/count * 10 ) / 10
Math.round(Math.sqrt(sqD/y) * 10 ) / 10
Gracias
var num = 34.7654;
num = Math.round(num * 10) / 10;
console.log(num); // Logs: 34.8
var number = 123.456;
console.log(number.toFixed(1)); // should round to 123.5