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 sais pas s'il existe un meilleur moyen de le faire, sinon de le séparer à la virgule décimale pour conserver le premier bit. Il doit y avoir...
Math.floor()
est la réponse.
Arrondi vers l'infini négatif - Math.floor()
+3.5 => +3.0
-3.5 => -4.0
Arrondir vers zéro - généralement appelé Truncate()
, mais non pris en charge par JavaScript - peut être imité 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()
Math.floor()
fonctionnera, mais c’est très lent comparé à 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 | 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 );
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
Pour arrondir vers l'infini négatif, utilisez:
rounded=Math.floor(number);
Pour arrondir à zéro (si le nombre peut arrondir à un entier de 32 bits compris entre -2147483648 et 2147483647), utilisez
rounded=number|0;
Pour arrondir à zéro (pour n'importe quel nombre), utilisez:
if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);
Arrondir une number
vers 0
peut être fait en soustrayant sa fraction décimale signée number % 1
:
rounded = number - number % 1;
Comme Math.floor
(arrondit à -Infinity
), cette méthode est parfaitement précise.
Il existe des différences dans le traitement de -0
, +Infinity
et -Infinity
bien que:
Math.floor(-0) => -0
-0 - -0 % 1 => +0
Math.floor(Infinity) => Infinity
Infinity - Infinity % 1 => NaN
Math.floor(-Infinity) => -Infinity
-Infinity - -Infinity % 1 => NaN
Math.floor(1+7/8)
Je me suis mis à jouer avec le code de quelqu'un d'autre aujourd'hui et j'ai trouvé ce qui suit qui semble également arrondi:
var dec = 12.3453465,
int = dec >> 0; // returns 12
Pour plus d'informations sur le décalage droit de propagation des signes (>>), voir Opérateurs binaire MDN
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.
Voici math.floor utilisé dans un exemple simple. Cela pourrait aider un nouveau développeur à se faire une idée de son utilisation dans une fonction et de ses fonctions. 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>
Vous devez mettre -1 pour arrondir la moitié puis 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>