Hay, comment ferais-je pour arrondir un nombre au multiple de 3 le plus proche?
c'est à dire
25 would return 27
1 would return 3
0 would return 3
6 would return 6
merci
if(n > 0)
return Math.ceil(n/3.0) * 3;
else if( n < 0)
return Math.floor(n/3.0) * 3;
else
return 3;
Vous voilà!
Number.prototype.roundTo = function(num) {
var resto = this%num;
if (resto <= (num/2)) {
return this-resto;
} else {
return this+num-resto;
}
}
Exemples:
y = 236.32;
x = y.roundTo(10);
// results in x = 240
y = 236.32;
x = y.roundTo(5);
// results in x = 235
Simplement:
3.0*Math.round(n/3.0)
?
Comme mentionné dans un commentaire sur la réponse acceptée, vous pouvez simplement utiliser ceci:
Math.ceil(x/3)*3
(Même s'il ne retourne pas 3 quand x
est 0, parce que c'était probablement une erreur de l'OP.)
Sur les neuf réponses postées avant celle-ci (qui n'ont pas été supprimées ou dont le score est si faible qu'elles ne sont pas visibles par tous les utilisateurs), seules celles de Dean Nicholson (à l'exception du problème de perte de signification) Beauburrier sont corrects. La réponse acceptée donne un résultat erroné pour les nombres négatifs et ajoute une exception pour 0 afin de prendre en compte ce qui était probablement une erreur du PO. Deux autres réponses arrondissent un nombre au plus proche multiple au lieu de toujours arrondir, une de plus donne le mauvais résultat pour les nombres négatifs et trois autres donnent même le mauvais résultat pour les nombres positifs.
Je réponds à cela en psuedocode puisque je programme principalement dans SystemVerilog et Vera (ASIC HDL). % représente une fonction de module.
round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)
Cela fonctionne dans tous les cas.
Le module du nombre calcule le reste, en soustrayant celui des résultats du diviseur au nombre nécessaire pour atteindre le prochain multiple du diviseur, la "magie" se produisant. On pourrait penser qu’il est assez bon d’avoir la fonction single module, mais dans le cas où le nombre est un multiple exact du diviseur, il calcule un multiple supplémentaire. c'est-à-dire que 24 renverrait 27. Le module supplémentaire protège contre cela en faisant l'addition 0.
Cette fonction arrondira au multiple le plus proche du facteur que vous fournissez . Elle ne complétera pas 0 ni les nombres qui sont déjà des multiples.
round_up = function(x,factor){ return x - (x%factor) + (x%factor>0 && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
0
round_up(6,3)
6
Le comportement pour 0 n'est pas ce que vous avez demandé, mais semble plus cohérent et utile de cette façon. Si vous voulez arrondir 0, la fonction suivante le ferait:
round_up = function(x,factor){ return x - (x%factor) + ( (x%factor>0 || x==0) && factor);}
round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
3
round_up(6,3)
6
(n - n mod 3) +3
En me basant sur l’approche de @ Makram, j’ai constaté que l’exemple original de Math.prototype n’arrondait pas avec précision les nombres négatifs. Voici une fonction légèrement modifiée qui traite à la fois les nombres positifs et négatifs dans l'instance et les valeurs multiples:
Number.prototype.mround = function(_mult) {
var base = Math.abs(this);
var mult = Math.abs(_mult);
var mod = (base % mult);
if (mod <= (mult / 2)) {
base -= mod;
} else {
base += (mult - mod);
}
return (this<0)?-base:base ;
}
Exemples: .__ (- 2) .mround (3) renvoie -3;
(0) .mround (3) renvoie 0;
(2) .round (3) renvoie 3;
(25,4) .round (3) renvoie 24;
$(document).ready(function() {
var modulus = 3;
for (i=0; i < 21; i++) {
$("#results").append("<li>" + roundUp(i, modulus) + "</li>")
}
});
function roundUp(number, modulus) {
var remainder = number % modulus;
if (remainder == 0) {
return number;
} else {
return number + modulus - remainder;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Round up to nearest multiple of 3:
<ul id="results">
</ul>