Je suis dans une situation où une fonction JavaScript produit des nombres, tels que 2.5. Je veux que ces points cinq soient arrondis à 2, plutôt que le résultat de Math.round, qui sera toujours arrondi dans de tels cas (en ignorant la règle paire), produisant 2. Y a-t-il un façon plus élégante de le faire que de soustraire 0,01 du nombre avant d'arrondir? Merci.

7
John E. Lepage 6 mars 2016 à 03:58

4 réponses

Meilleure réponse

Niez simplement l'entrée et la sortie à Math.round:

var result = -Math.round(-num);

Plus en détail: le Math.round de JavaScript a la propriété inhabituelle qu'il arrondit la moitié des cas vers l'infini positif, qu'ils soient positifs ou négatifs. Par exemple, 2.5 arrondira à 3.0, mais -2.5 arrondira à -2.0. Il s'agit d'un mode d'arrondi inhabituel: il est beaucoup plus courant d'arrondir les cas à mi-chemin soit loin de zéro (donc -2.5 arrondirait à -3.0), soit à l'entier pair le plus proche.

Cependant, il a la belle propriété qu'il est trivial de l'adapter à des cas à mi-chemin vers l'infini négatif à la place: si c'est ce que vous voulez, alors tout ce que vous avez à faire est de nier à la fois l'entrée et la sortie:

Exemple:

function RoundHalfDown(num) {
  return -Math.round(-num);
}

document.write("1.5 rounds to ", RoundHalfDown(1.5), "<br>");
document.write("2.5 rounds to ", RoundHalfDown(2.5), "<br>");
document.write("2.4 rounds to ", RoundHalfDown(2.4), "<br>");
document.write("2.6 rounds to ", RoundHalfDown(2.6), "<br>");
document.write("-2.5 rounds to ", RoundHalfDown(-2.5), "<br>");
16
Mark Dickinson 6 mars 2016 à 15:56

Il existe une autre méthode qui consiste à utiliser des nombres réels (au lieu de 0,2, utilisez 20, 0,02, utilisez 2, etc.), puis ajoutez une variable flottantePoints qui divisera le résultat (dans votre cas, c'est 2). Par conséquent, vous pouvez fonctionner en tant que Number / (10 ^ floatingPoints). Cette solution est large dans toutes les sociétés Forex.

0
acdev 6 mars 2016 à 01:06

Faites ceci:

var result = (num - Math.Floor(num)) > 0.5 ? Math.Round(num):Math.Floor(num);
4
Ashraf Iqbal 6 mars 2016 à 01:15

Vous pouvez également utiliser cette fonction pour arrondir sans partie décimale et avec une règle de 0,5 vers le bas (uniquement les nombres positifs):

function customRound(number) {
   var decimalPart = number % 1;
   if (decimalPart === 0.5)
      return number - decimalPart;
   else
      return Math.round(number);
}

Et désolé pour mon anglais.

0
Tomás Vélez 1 sept. 2017 à 21:46