Javascript: arredondar para o próximo múltiplo de 5


113

Preciso de uma função de utilidade que receba um valor inteiro (variando de 2 a 5 dígitos de comprimento) que arredonde para o próximo múltiplo de 5 em vez do próximo múltiplo de 5. Aqui está o que consegui:

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

Quando eu corro round5(32), ele me dá 30onde eu quero 35.
Quando eu corro round5(37), ele me dá 35onde eu quero 40.

Quando eu corro round5(132), ele me dá 130onde eu quero 135.
Quando eu corro round5(137), ele me dá 135onde eu quero 140.

etc ...

Como eu faço isso?


3
Deve round5(5)dar 5 ou 10?
user2357112 suporta Monica em

1
Que tal: dividir x por 5, arredondar para cima até o número inteiro mais próximo (usando a função Math.ceil) e depois multiplicar por 5?
Martin Wilson

2
round5 (5) deve dar 5
Amit Erandole

Respostas:


270

Isso fará o trabalho:

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

É apenas uma variação do arredondamento comum numberpara o múltiplo de xfunção mais próximo Math.round(number/x)*x, mas usar em .ceilvez de .roundfaz com que ele sempre arredonde para cima em vez de para baixo / para cima de acordo com as regras matemáticas.


você poderia explicar um pouco sobre como você chegou a essa solução tão rápido? Eu pensei que Math.ceil só arredonda os decimais para inteiros inteiros.
Amit Erandole

2
Bem, é arredondado para o número inteiro inteiro aqui, @AmitErandole;)
Michael Krelin - hacker

1
+1 para compacto e eficiente ... e vai arredondar para 10, certo? :)
zx81

Eu adicionaria outro parâmetro a esta função, indicando o "arredondador", para que o número original possa ser arredondado para o que definimos na chamada de função e não apenas para 5 ...
TheCuBeMan

3
Eu amo essa solução! Implementei-o com um encerramento para alterar convenientemente o múltiplo em linha conforme necessário: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mUso:roundToNearestMultipleOf(5)(32)
gfullam

10
const roundToNearest5 = x => Math.round(x/5)*5

Isso arredondará o número para o 5 mais próximo. Para arredondar sempre para o 5 mais próximo, use Math.ceil. Da mesma forma, para sempre arredondar para baixo, use em Math.floorvez de Math.round. Você pode então chamar esta função como faria com qualquer outra. Por exemplo,

roundToNearest5(21)

retornará:

20

A resposta aceita está realmente errada. Esta é a maneira correta. Também funciona com decimais como 2,5
Oliver Dixon


5

Cheguei aqui enquanto procurava algo semelhante. Se o meu número for —0, —1, —2, deve ser de —0, e se for —3, —4, —5 deve atingir —5.

Eu encontrei esta solução:

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

E os testes:

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

1
Isso pode ser feito de forma mais simples 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 ;

Atenciosamente Paul


0

// arredondar com precisão

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

// arredondar para 5 com precisão

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}

0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

A razão para usar round é que a entrada esperada pode ser um número aleatório.

Obrigado!!!


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

talvez?


ReferenceError: intnão está definido. Talvez você quisesse parseInt, mas isso não seria necessário, pois Math.floorretorna um número.
pawel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.