Javascript: arrondir au multiple supérieur de 5

115

J'ai besoin d'une fonction utilitaire qui prend une valeur entière (allant de 2 à 5 chiffres de longueur) qui arrondit au prochain multiple de 5 au lieu du multiple le plus proche de 5. Voici ce que j'ai obtenu:

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

Quand je cours round5(32), ça me donne 30là où je veux 35.
Quand je cours round5(37), ça me donne 35là où je veux 40.

Quand je cours round5(132), ça me donne 130où je veux 135.
Quand je cours round5(137), ça me donne 135où je veux 140.

etc...

Comment puis-je faire cela?

Amit Erandole
la source
3
Devrait round5(5)donner 5 ou 10?
user2357112 prend en charge Monica le
1
Que diriez-vous: divisez x par 5, arrondissez à l'entier supérieur le plus proche (en utilisant la fonction Math.ceil), puis multipliez par 5?
Martin Wilson
2
round5 (5) devrait donner 5
Amit Erandole

Réponses:

274

Cela fera le travail:

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

C'est juste une variation de l'arrondi commun numberau multiple le plus proche de la xfonction Math.round(number/x)*x, mais utiliser .ceilau lieu de le .roundfait toujours arrondir au lieu de bas / haut selon des règles mathématiques.

cliquet
la source
pouvez-vous expliquer un peu comment vous êtes arrivé à cette solution si rapidement? Je pensais que Math.ceil arrondissait uniquement les décimales à des entiers entiers.
Amit Erandole
2
Eh bien, il arrondit à l'entier entier ici, @AmitErandole;)
Michael Krelin - hacker
1
+1 pour compact et efficace ... et il s'arrondira à 10, non? :)
zx81
J'ajouterais un autre paramètre à cette fonction, indiquant le "rounder", de sorte que le nombre d'origine puisse être arrondi à ce que nous avons défini dans l'appel de fonction et pas seulement fixé à 5 ...
TheCuBeMan
3
J'adore cette solution! Je l'ai implémenté avec une fermeture pour changer facilement les multiples en ligne selon les besoins: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mUtilisation:roundToNearestMultipleOf(5)(32)
gfullam
12
const roundToNearest5 = x => Math.round(x/5)*5

Cela arrondira le nombre au 5 le plus proche. Pour toujours arrondir au 5 le plus proche, utilisez Math.ceil. De même, pour toujours arrondir vers le bas, utilisez Math.floorplutôt que Math.round. Vous pouvez alors appeler cette fonction comme vous le feriez pour n'importe quelle autre. Par exemple,

roundToNearest5(21)

retournera:

20
Spencer Stolworthy
la source
La réponse acceptée est en fait fausse. C'est la bonne manière. Fonctionne également avec des nombres décimaux tels que 2,5
Oliver Dixon
5

Comme ça?

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

Je suis arrivé ici en cherchant quelque chose de similaire. Si mon nombre est —0, —1, —2, il devrait passer à —0, et s'il est —3, —4, —5, il devrait plafonner à —5.

J'ai trouvé cette solution:

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

Et les tests:

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
la source
1
Cela peut être accompli plus simplement en utilisantMath.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 ;

Cordialement Paul

Paul Neulat
la source
0

// rond avec précision

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

// arrondi à 5 avec précision

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

La raison d'utiliser round est que l'entrée attendue peut être un nombre aléatoire.

Merci!!!

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

peut être?

MyFantasy512
la source
ReferenceError: intn'est pas défini. Peut-être que vous vouliez parseInt, mais ce ne serait pas nécessaire car Math.floorrenvoie un nombre.
pawel