285 votes

Comment arrondir un nombre à la baisse en Javascript ?

Comment arrondir un nombre à la baisse en JavaScript ?

math.round() ne fonctionne pas car il arrondit à la décimale la plus proche.

Je ne suis pas sûr qu'il y ait une meilleure façon de procéder que de le séparer à la virgule et de conserver le premier bit. Il doit y avoir...

21 votes

Arrondir vers zéro ou vers l'infini négatif ?

490voto

phoebus Points 7358

Utilisation de Math.floor() est un moyen d'y parvenir.

Plus d'informations : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

3 votes

C'est également la méthode la plus lente ; si vous devez en effectuer un grand nombre, utilisez l'opérateur bitwise | (voir mon billet).

16 votes

L'opérateur | arrondit également vers zéro, et non vers l'infini négatif.

70voto

Daniel Brückner Points 36242

Tourner vers l'infini négatif - Math.floor()

+3.5 => +3.0
-3.5 => -4.0

L'arrondi vers zéro peut être effectué en utilisant Math.trunc() . Les navigateurs plus anciens ne prennent pas en charge cette fonction. Si vous devez les prendre en charge, vous pouvez utiliser Math.ceil() pour les nombres négatifs et Math.floor() pour les nombres positifs.

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()

0 votes

Merci pour l'exhaustivité mais la majuscule est fausse ... et en java-script cela fait une énorme différence. Sinon, j'aurais fait un vote positif ici.

1 votes

J'ai mis à jour la réponse afin que la capitalisation soit maintenant correcte.

24 votes

@George ÉNORME ou énorme ? :D

42voto

geraldalewis Points 429

Math.floor() fonctionnera, mais c'est très lent comparé à l'utilisation d'une méthode bit à bit. OR fonctionnement :

var rounded = 34.923 | 0;
alert( rounded );
//alerts "34"

EDIT Math.floor() est pas plus lent que l'utilisation de l'opérateur |. Merci à Jason S pour avoir vérifié mon travail.

Voici le code que j'ai utilisé pour tester :

var a = [];
var time = new Date().getTime();
for( i = 0; i < 100000; i++ ) {
    //a.push( Math.random() * 100000  | 0 );
    a.push( Math.floor( Math.random() * 100000 ) );
}
var elapsed = new Date().getTime() - time;
alert( "elapsed time: " + elapsed );

12 votes

? ?? Je viens de lancer jsdb (www.jsdb.org) qui utilise Spidermonkey 1.7, et j'ai exécuté une boucle pour additionner la valeur plancher de x[i] sur un tableau de 100000 nombres à virgule flottante, d'abord avec Math.floor(), puis avec bitwise ou comme vous le suggérez. Cela a pris à peu près le même temps, 125 msec.

4 votes

Je viens de répéter le test avec 500000 nombres à virgule flottante, cela a pris à peu près le même temps, environ 625 msec.

6 votes

Donc je ne vois pas en quoi 1,25usec est très lent.

25voto

Petr Hurtak Points 84

Vous pouvez essayer d'utiliser cette fonction si vous avez besoin d'arrondir à un nombre spécifique de décimales.

function roundDown(number, decimals) {
    decimals = decimals || 0;
    return ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals) );
}

exemples

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990

1 votes

Je pense qu'une phrase comme celle-ci ne nécessite pas de fonction.

5 votes

RoundDown(4.56, 2) vous donne 4.55, donc je ne pense pas que ce soit une bonne solution.

7voto

Mike Godin Points 303

Pour arrondir vers l'infini négatif, utilisez :

rounded=Math.floor(number);

Pour arrondir vers zéro (si le nombre peut être arrondi à un entier 32 bits entre -2147483648 et 2147483647), utilisez :

rounded=number|0;

Pour arrondir vers le bas vers zéro (pour n'importe quel nombre), utilisez :

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X