Javascript: redondee al siguiente múltiplo de 5

113

Necesito una función de utilidad que tome un valor entero (de 2 a 5 dígitos de longitud) que se redondea al siguiente múltiplo de 5 en lugar del múltiplo más cercano de 5. Esto es lo que obtuve:

function round5(x)
{
    return (x % 5) >= 2.5 ? parseInt(x / 5) * 5 + 5 : parseInt(x / 5) * 5;
}

Cuando corro round5(32), me da 30, donde quiero 35.
Cuando corro round5(37), me da 35, donde quiero 40.

Cuando corro round5(132), me da 130, donde quiero 135.
Cuando corro round5(137), me da 135, donde quiero 140.

etc ...

¿Cómo hago esto?

Amit Erandole
fuente
3
¿Debería round5(5)dar 5 o 10?
user2357112 apoya a Monica
1
¿Qué tal: dividir x entre 5, redondear al número entero más cercano (usando la función Math.ceil) y luego multiplicar por 5?
Martin Wilson
2
round5 (5) debería dar 5
Amit Erandole

Respuestas:

271

Esto hará el trabajo:

function round5(x)
{
    return Math.ceil(x/5)*5;
}

Es solo una variación del redondeo común numberal múltiplo de xfunción más cercano Math.round(number/x)*x, pero usar en .ceillugar de .roundhace que siempre se redondee hacia arriba en lugar de hacia abajo / hacia arriba de acuerdo con las reglas matemáticas.

pawel
fuente
¿podría explicar un poco cómo llegó a esta solución tan rápido? Pensé que Math.ceil solo redondea decimales a números enteros.
Amit Erandole
2
Bueno, aquí se redondea al entero entero, @AmitErandole;)
Michael Krelin - hacker
1
+1 para compacto y eficiente ... y se redondeará a 10, ¿verdad? :)
zx81
Agregaría otro parámetro a esta función, indicando el "redondeo", por lo que el número original se puede redondear a lo que establezcamos en la llamada a la función y no solo fijo 5 ...
TheCuBeMan
3
¡Amo esta solución! Lo implementé con un cierre para cambiar convenientemente el múltiple en línea según sea necesario: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mUso:roundToNearestMultipleOf(5)(32)
gfullam
12
const roundToNearest5 = x => Math.round(x/5)*5

Esto redondeará el número al 5 más cercano. Para redondear siempre al 5 más cercano, utilice Math.ceil. Del mismo modo, para redondear siempre hacia abajo, utilice en Math.floorlugar de Math.round. A continuación, puede llamar a esta función como lo haría con cualquier otra. Por ejemplo,

roundToNearest5(21)

volverá:

20
Spencer Stolworthy
fuente
La respuesta aceptada es realmente incorrecta. Esta es la forma correcta. También funciona con decimales como 2.5
Oliver Dixon
5

¿Me gusta esto?

function roundup5(x) { return (x%5)?x-x%5+5:x }
Michael Krelin - hacker
fuente
5

Llegué aquí buscando algo similar. Si mi número es —0, —1, —2, debería bajar a —0, y si es —3, —4, —5 debería bajar a —5.

Se me ocurrió esta solución:

function round(x) { return x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5 }

Y las pruebas:

for (var x=40; x<51; x++) {
  console.log(x+"=>", x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5)
}
// 40 => 40
// 41 => 40
// 42 => 40
// 43 => 45
// 44 => 45
// 45 => 45
// 46 => 45
// 47 => 45
// 48 => 50
// 49 => 50
// 50 => 50
AymKdn
fuente
1
Esto se puede lograr de manera más simple usandoMath.round
Spencer Stolworthy
2
voici 2 solutions possibles :
y= (x % 10==0) ? x : x-x%5 +5; //......... 15 => 20 ; 37 => 40 ;  41 => 45 ; 20 => 20 ; 

z= (x % 5==0) ? x : x-x%5 +5;  //......... 15 => 15 ; 37 => 40 ;  41 => 45 ; 20 => 20 ;

Saludos Paul

Paul Neulat
fuente
0

// redondear con precisión

var round = function (value, precision) {
    return Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);
};

// redondear a 5 con precisión

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}
Dennis T
fuente
0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

La razón para usar round es que la entrada esperada puede ser un número aleatorio.

¡¡¡Gracias!!!

Parit
fuente
-2
if( x % 5 == 0 ) {
    return int( Math.floor( x / 5 ) ) * 5;
} else {
    return ( int( Math.floor( x / 5 ) ) * 5 ) + 5;
}

¿tal vez?

MyFantasy512
fuente
ReferenceError: intno está definido. Quizás quisiera parseInt, pero esto no sería necesario ya que Math.floordevuelve un número.
pawel