Comment arrondir un nombre en Javascript?

228

Comment arrondir un nombre en JavaScript?

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

Je ne sais pas s'il y a une meilleure façon de le faire autre que de le séparer au point décimal en gardant le premier bit. Il doit y avoir...

Ben Shelock
la source
21
Arrondi vers zéro ou vers l'infini négatif?
Daniel Brückner

Réponses:

60

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

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

L'arrondi vers zéro - généralement appelé Truncate(), mais non pris en charge par JavaScript - peut être émulé en utilisant Math.ceil()des nombres négatifs et Math.floor()des nombres positifs.

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()
Daniel Brückner
la source
Merci pour l'exhaustivité mais la capitalisation est incorrecte ... et en java-script qui fait une énorme différence. Sinon, j'aurais voté ici.
George
J'ai mis à jour la réponse pour que la capitalisation soit maintenant correcte.
chasen
18
@George ÉNORME ou énorme? : D
m93a
1
Vous pouvez obtenir le même effet que l'arrondi à zéro via x | 0.
Ahmed Fasih
28

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

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

EDIT Math.floor() n'est pas plus lent que d'utiliser le | opérateur. Merci à Jason S d'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 );
geraldalewis
la source
11
??? Je viens de lancer jsdb (www.jsdb.org) qui utilise Spidermonkey 1.7, et j'ai exécuté une boucle pour résumer la valeur plancher de x [i] sur un tableau de 100000 nombres à virgule flottante, d'abord avec Math.floor (), puis avec bit à bit ou comme vous le suggérez. Cela a pris environ le même temps, 125 ms.
Jason S
4
Je viens de répéter le test avec 500 000 nombres à virgule flottante, cela a pris environ le même temps, environ 625 ms.
Jason S
5
Donc je ne vois pas comment 1.25usec est très lent.
Jason S
3
Je ne peux pas discuter avec vos données :) Je pense que j'ai peut-être confondu l'implémentation de JS avec ActionScript (construit sur EcmaScript; évidemment l'implémentation diffère). Merci d'avoir vérifié mon travail!
geraldalewis
14
Ils ne font pas la même chose non plus. |convertit en un entier 32 bits, tronqué; Math.floorarrondit vers le bas. jsfiddle.net/minitech/UVG2w
Ry-
21

Vous pouvez essayer d'utiliser cette fonction si vous devez 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
Petr Hurtak
la source
Je pense qu'un one-liner comme celui-ci ne nécessite pas de fonction.
Hubert Grzeskowiak
4
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:

rounded=Math.floor(number);

Pour arrondir vers le bas vers zéro (si le nombre peut arrondir à un entier 32 bits compris 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);
Mike Godin
la source
5

L'arrondi d'un numbervers 0peut être effectué en soustrayant sa partie fractionnaire signée number % 1:

rounded = number - number % 1;

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

Il existe des différences dans le traitement des -0, +Infinityet -Infinitysi:

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

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

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN
Robert
la source
3
Math.floor(1+7/8)
DigitalRoss
la source
1 + 7/8 = 1 - Pas besoin de Math.floor () là :) :)
Jason Berry
18
En fait c'est (7/8) +1 qui n'est pas 1. Merci algèbre de 3e année
Joe Phillips
1
Umm, veuillez essayer ceci dans un programme javascript. J'ai fait. Affichez (1 + 7/8) et vous verrez 1.875. Math.round (...) est 2, Math.floor (...) est 1. De quoi parlez-vous les gars?
DigitalRoss
1
Ou ouvrez la console d'erreur Firefox. Ou Firebug. Ce n'est pas difficile à essayer. Je l'ai essayé. 1 + 7/8 est 1,875 en js. Avez-vous peut-être oublié que toutes les mathématiques en js sont en virgule flottante?
DigitalRoss
3
Il est probablement facile d'oublier que javascript fait tout en virgule flottante. Dans de nombreuses autres langues, 1 + 7/8 est égal à 1, mais en js, il vaut vraiment 1,875.
DigitalRoss
3

Était en train de jouer avec du code elses de quelqu'un aujourd'hui et a trouvé ce qui semble arrondi aussi:

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

Pour plus d'informations sur le décalage à droite de la propagation des signes (>>), voir Opérateurs MDN au niveau du bit

Il m'a fallu un certain temps pour comprendre ce que cela faisait: D

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

Alastair Hodgson
la source
3
Il tue également silencieusement votre numéro s'il ne tient pas en 32 bits. Console Chrome: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs
0

Vous devez mettre -1 pour arrondir la moitié et ensuite multiplier par -1 comme dans l'exemple ci-dessous.

<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>
João Paulo Santarém
la source
Honnêtement Dans cette communauté, nous préférons des réponses comme @phoebus ci-dessus.
Ankit Pandey
0

Voici math.floor utilisé dans un exemple simple. Cela pourrait aider un nouveau développeur à se faire une idée de comment l'utiliser dans une fonction et ce qu'elle fait. J'espère que ça aide!

<script>

var marks = 0;

function getRandomNumbers(){    //  generate a random number between 1 & 10
    var number = Math.floor((Math.random() * 10) + 1);
    return number;
}

function getNew(){  
/*  
    This function can create a new problem by generating two random numbers. When the page is loading as the first time, this function is executed with the onload event and the onclick event of "new" button.
*/
document.getElementById("ans").focus();
var num1 = getRandomNumbers();
var num2 = getRandomNumbers();
document.getElementById("num1").value = num1;
document.getElementById("num2").value = num2;

document.getElementById("ans").value ="";
document.getElementById("resultBox").style.backgroundColor = "maroon"
document.getElementById("resultBox").innerHTML = "***"

}

function checkAns(){
/*
    After entering the answer, the entered answer will be compared with the correct answer. 
        If the answer is correct, the text of the result box should be "Correct" with a green background and 10 marks should be added to the total marks.
        If the answer is incorrect, the text of the result box should be "Incorrect" with a red background and 3 marks should be deducted from the total.
        The updated total marks should be always displayed at the total marks box.
*/

var num1 = eval(document.getElementById("num1").value);
var num2 = eval(document.getElementById("num2").value);
var answer = eval(document.getElementById("ans").value);

if(answer==(num1+num2)){
    marks = marks + 10;
    document.getElementById("resultBox").innerHTML = "Correct";
    document.getElementById("resultBox").style.backgroundColor = "green";
    document.getElementById("totalMarks").innerHTML= "Total marks : " + marks;

}

else{
    marks = marks - 3;
    document.getElementById("resultBox").innerHTML = "Wrong";
    document.getElementById("resultBox").style.backgroundColor = "red";
    document.getElementById("totalMarks").innerHTML = "Total Marks: " + marks ;
}




}

</script>
</head>

<body onLoad="getNew()">
    <div class="container">
        <h1>Let's add numbers</h1>
        <div class="sum">
            <input id="num1" type="text" readonly> + <input id="num2" type="text" readonly>
        </div>
        <h2>Enter the answer below and click 'Check'</h2>
        <div class="answer">
            <input id="ans" type="text" value="">
        </div>
        <input id="btnchk" onClick="checkAns()" type="button" value="Check" >
        <div id="resultBox">***</div>
        <input id="btnnew" onClick="getNew()" type="button" value="New">
        <div id="totalMarks">Total marks : 0</div>  
    </div>
</body>
</html>
indranatha madugalle
la source