Wie kann ich eine Zahl in Javascript abrunden?

227

Wie kann ich eine Zahl in JavaScript abrunden?

math.round() funktioniert nicht, weil es auf die nächste Dezimalstelle gerundet wird.

Ich bin mir nicht sicher, ob es einen besseren Weg gibt, als es beim Dezimalpunkt auseinanderzubrechen, um das erste Bit beizubehalten. Da muss sein...

Ben Shelock
quelle
21
Runde gegen Null oder gegen negative Unendlichkeit?
Daniel Brückner

Antworten:

60

Runde in Richtung negative Unendlichkeit - Math.floor()

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

Eine Runde gegen Null - normalerweise aufgerufen Truncate(), aber von JavaScript nicht unterstützt - kann mit Math.ceil()negativen und Math.floor()positiven Zahlen emuliert werden .

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()
Daniel Brückner
quelle
Vielen Dank für die Vollständigkeit, aber die Großschreibung ist falsch ... und in Java-Skript macht das einen RIESIGEN Unterschied. Sonst hätte ich hier gestimmt.
George
Ich habe die Antwort so aktualisiert, dass die Großschreibung jetzt korrekt ist.
Chasen
18
@ George RIESIG oder riesig? : D
m93a
1
Sie können den gleichen Effekt erzielen wie Rundung auf Null über x | 0.
Ahmed Fasih
28

Math.floor()wird funktionieren, aber es ist sehr langsam im Vergleich zu einer bitweisen OROperation:

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

EDIT Math.floor() ist nicht langsamer als die Verwendung von | Operator. Vielen Dank an Jason S für die Überprüfung meiner Arbeit.

Hier ist der Code, den ich zum Testen verwendet habe:

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
quelle
11
??? Ich habe gerade jsdb (www.jsdb.org) ausgeführt, das Spidermonkey 1.7 verwendet, und eine Schleife ausgeführt, um den Grundwert von x [i] auf einem Array von 100000 Gleitkommazahlen zusammenzufassen, zuerst mit Math.floor (). dann mit bitweise oder wie du vorschlägst. Es dauerte ungefähr zur gleichen Zeit, 125 ms.
Jason S
4
Gerade den Test mit 500000 Gleitkommazahlen wiederholt, dauerte es ungefähr die gleiche Zeit, ungefähr 625 ms.
Jason S
5
Ich sehe also nicht, wie langsam 1.25usec ist.
Jason S
3
Ich kann nicht mit Ihren Daten streiten :) Ich glaube, ich habe die Implementierung von JS mit der von ActionScript verwechselt (basierend auf EcmaScript; offensichtlich unterscheidet sich die Implementierung). Danke, dass du meine Arbeit überprüft hast!
Geraldalewis
14
Sie machen auch nicht dasselbe. |konvertiert in eine 32-Bit-Ganzzahl und schneidet ab; Math.floorrundet ab. jsfiddle.net/minitech/UVG2w
Ry-
21

Sie können versuchen, diese Funktion zu verwenden, wenn Sie auf eine bestimmte Anzahl von Dezimalstellen abrunden müssen

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

Beispiele

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990
Petr Hurtak
quelle
Ich denke, ein Einzeiler wie dieser benötigt keine Funktion.
Hubert Grzeskowiak
4
roundDown (4.56, 2) gibt Ihnen 4.55, daher halte ich es nicht für eine gute Lösung.
Cryss
6

Um auf negative Unendlichkeit abzurunden, verwenden Sie:

rounded=Math.floor(number);

Verwenden Sie Folgendes, um auf Null abzurunden (wenn die Zahl auf eine 32-Bit-Ganzzahl zwischen -2147483648 und 2147483647 gerundet werden kann):

rounded=number|0;

Verwenden Sie zum Abrunden auf Null (für eine beliebige Zahl):

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

Das Runden einer numberRichtung 0kann durch Subtrahieren des vorzeichenbehafteten Bruchteils erfolgen number % 1:

rounded = number - number % 1;

Wie Math.floor(rundet auf-Infinity ) ist diese Methode vollkommen genau.

Es gibt Unterschiede in der Handhabung von -0, +Infinityund -Infinityzwar:

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
quelle
3
Math.floor(1+7/8)
DigitalRoss
quelle
1 + 7/8 = 1 - Math.floor () braucht dort nicht viel :)
Jason Berry
18
Eigentlich ist es (7/8) +1, was nicht 1 ist. Danke Algebra der 3. Klasse
Joe Phillips
1
Umm, bitte versuchen Sie dies tatsächlich in einem Javascript-Programm. Ich tat. Anzeige (1 + 7/8) und Sie sehen 1.875. Math.round (...) ist 2, Math.floor (...) ist 1. Worüber redet ihr?
DigitalRoss
1
Oder öffnen Sie die Firefox-Fehlerkonsole. Oder Firebug. Es ist nicht schwer zu versuchen. Ich versuchte es. 1 + 7/8 ist 1,875 in js. Haben Sie möglicherweise vergessen, dass alle Mathematik in js in Gleitkomma ist?
DigitalRoss
3
Es ist wahrscheinlich leicht zu vergessen, dass Javascript alles in Gleitkomma macht. In vielen anderen Sprachen ist 1 + 7/8 1, aber in js ist es wirklich 1,875.
DigitalRoss
3

Ich habe heute mit einem anderen Code herumgespielt und Folgendes gefunden, das ebenfalls abgerundet zu sein scheint:

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

Weitere Informationen zur Vorzeichenausbreitung nach rechts (>>) finden Sie unter Bitweise MDN-Operatoren

Ich brauchte eine Weile, um herauszufinden, was das tat: D.

Aber wie oben hervorgehoben, funktioniert Math.floor () und sieht meiner Meinung nach besser lesbar aus.

Alastair Hodgson
quelle
3
Es tötet auch still Ihre Nummer, wenn es nicht in 32 Bit passt. Chromkonsole: 9999999999999999999999999 | 0 => -167772160
Matthias Urlichs
0

Sie müssen -1 setzen, um die Hälfte abzurunden, und danach wie im folgenden Beispiel mit -1 multiplizieren.

<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
quelle
Ehrlich gesagt In dieser Community bevorzugen wir Antworten wie @phoebus oben.
Ankit Pandey
0

Hier wird math.floor in einem einfachen Beispiel verwendet. Dies kann einem neuen Entwickler helfen, eine Vorstellung davon zu bekommen, wie er in einer Funktion verwendet wird und was er tut. Ich hoffe es hilft!

<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
quelle