2009-09-16 6 views
189

Comment puis-je arrondir un nombre en JavaScript?Comment puis-je arrondir un nombre en Javascript?

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

Je ne suis pas sûr s'il y a une meilleure façon de le faire autrement que de le séparer à la virgule décimale en gardant le premier bit. Il doit y avoir ...

+19

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

Répondre

363
Math.floor() 

est la réponse.

+2

C'est aussi la méthode la plus lente; Si vous avez besoin d'effectuer beaucoup de ceux-ci, utilisez le bitwise | opérateur (voir mon message). – geraldalewis

+6

Le | L'opérateur ne travaillera pas sur les numéros supérieurs à 2147483647. –

+10

Le | L'opérateur arrondit également vers zéro, pas l'infini négatif. –

3
Math.floor(1+7/8) 
+0

1 + 7/8 = 1 - Pas vraiment besoin de Math.floor() là :) –

+16

En fait, c'est (7/8) +1 ce qui n'est pas 1. Merci l'algèbre de 3ème année –

+1

Umm, s'il vous plait essayez dans un programme javascript. J'ai fait. Affichage (1 + 7/8) et vous verrez 1.875. Math.round (...) est 2, Math.floor (...) est 1. De quoi parlez-vous? – DigitalRoss

18

Math.floor() fonctionnera, mais il est très lent par rapport à l'utilisation d'une opération au niveau du bit OR:

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

EDITMath.floor() est pas plus lent que d'utiliser le | opérateur. Merci à Jason S pour avoir vérifié mon travail.

Voici le code que j'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); 
+7

??? Je viens de lancer jsdb (www.jsdb.org) qui utilise Spidermonkey 1.7, et a exécuté une boucle pour résumer la valeur floored 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. Il a fallu environ le même temps, 125 msec. –

+2

Juste répété le test avec 500000 nombres à virgule flottante, il a fallu environ le même temps, environ 625 msec. –

+4

Donc, je ne vois pas comment 1.25usec est très lent. –

55

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

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

ronde vers zéro - le plus souvent appelé Truncate(), mais pas pris en charge par JavaScript - peut être émulé par en utilisant 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

Merci pour l'exhaustivité mais la capitalisation est fausse ... et en java-script cela fait une énorme différence. Sinon, je l'aurais upvoted ici. – George

+0

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

+15

@George énorme ou énorme? : D – m93a

2

tripotait ronde avec quelqu'un elses le code aujourd'hui et trouvé ce qui suit qui semble arrondit ainsi:

var dec = 12.3453465, 
int = dec >> 0; // returns 12 

Pour plus d'informations sur le déplacement vers la droite (>>) Sign-propagation voir MDN Bitwise Operators

Il m'a fallu un certain temps pour travailler ce que cela a été fait: D

Mais comme souligné plus haut, Math.floor() fonctionne et semble plus lisible à mon avis.

+1

Il tue également silencieusement votre numéro s'il ne rentre pas dans 32 bits. Console de chrome: 99999999999999999999999 | 0 => -167772160 –

16

Vous pouvez essayer d'utiliser cette fonction si vous devez arrondir à un certain nombre 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 
+0

Je pense qu'un one-liner comme celui-ci ne nécessite pas de fonction. –

+0

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

6

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

Pour arrondir à zéro (si le nombre peut arrondir à un entier 32 en -2147483648 et 2147483647), utilisez:

rounded=number|0; 

Pour arrondir vers le bas vers zéro (pour un nombre quelconque), utilisez:

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

Arrondir un number vers 0 peut être fait en soustrayant la partie décimale signée number % 1:

rounded = number - number % 1; 

Comme Math.floor (tours vers -Infinity) cette méthode est parfaitement précis.

Il existe des différences dans le traitement des -0, +Infinity et -Infinity si:

Math.floor(-0) => -0 
-0 - -0 % 1 => +0 

Math.floor(Infinity) => Infinity 
Infinity - Infinity % 1 => NaN 

Math.floor(-Infinity)  => -Infinity 
-Infinity - -Infinity % 1 => NaN 
-1

Vous devez mettre -1 à un demi-tour vers le bas et après que multiplier par -1 comme dans l'exemple ci-dessous vers le bas.

<script type="text/javascript"> 

    function roundNumber(number, precision, isDown) { 
    var factor = Math.pow(10, precision); 
    var tempNumber = number * factor; 
    var roundedTempNumber = 0; 
    if (isDown) { 
     tempNumber = -tempNumber; 
     roundedTempNumber = Math.round(tempNumber) * -1; 
    } else { 
     roundedTempNumber = Math.round(tempNumber); 
    } 
    return roundedTempNumber/factor; 
    } 
</script> 

<div class="col-sm-12"> 
    <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script> 
    </p> 
    <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p> 
</div> 
Questions connexes