2009-09-16 6 views
189

Wie kann ich eine Nummer in JavaScript abrunden?Wie kann ich eine Nummer in Javascript abrunden?

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

Ich bin mir nicht sicher, ob es eine bessere Möglichkeit gibt, es zu tun, als es am Dezimalpunkt auseinander zu brechen, um das erste Bit zu behalten. Es muss sein ...

+19

Rund gegen Null oder gegen negative Unendlichkeit? –

Antwort

363
Math.floor() 

ist die Antwort.

+2

Es ist auch die langsamste Methode; Wenn Sie viele davon ausführen müssen, verwenden Sie bitweises | Betreiber (siehe meinen Beitrag). – geraldalewis

+6

Die | Der Bediener arbeitet nicht mit Zahlen größer als 2147483647. –

+10

Die | Der Operator rundet auch auf Null, nicht auf die negative Unendlichkeit. –

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

1 + 7/8 = 1 - Nicht viel brauchen für Math.floor() da :) –

+16

Eigentlich ist es (7/8) +1 was nicht 1. Danke 3. Klasse Algebra –

+1

Umm, bitte versuchen Sie es tatsächlich in a Javascript-Programm. Ich tat. Anzeige (1 + 7/8) und Sie werden 1.875 sehen. Math.round (...) ist 2, Math.floor (...) ist 1. Worüber reden Sie? – DigitalRoss

18

Math.floor() funktionieren wird, aber es ist sehr langsam im Vergleich zur Verwendung einer bitweise OR Betrieb:

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

EDITMath.floor() ist nicht langsamer als die Verwendung | Operator. Danke an Jason S für die Überprüfung meiner Arbeit.

Hier ist der Code, den ich zu Test verwendet:

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

??? Ich habe gerade jsdb (www.jsdb.org) ausgeführt, das Spidermonkey 1.7 verwendet, und eine Schleife ausgeführt, um den floor'ed-Wert von x [i] auf einem Array von 100000 Fließkommazahlen zusammenzufassen, zuerst mit Math.floor(), dann mit bitweisem oder wie Sie vorschlagen. Es dauerte etwa die gleiche Zeit, 125 ms. –

+2

Wiederholen Sie einfach den Test mit 500000 Gleitkommazahlen, es dauerte etwa die gleiche Zeit, ca. 625 ms. –

+4

Also ich sehe nicht wie 1.25usec ist sehr langsam. –

55

Runde auf negative Unendlichkeit - Math.floor()

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

Runde gegen Null - in der Regel Truncate() genannt, aber nicht von JavaScript unterstützt - kann emuliert werden Verwenden Sie Math.ceil() für negative Zahlen und Math.floor() für positive Zahlen.

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

Vielen Dank für die Vollständigkeit, aber die Großschreibung ist falsch ... und in Java-Skript, das einen RIESIGEN Unterschied macht. Sonst wäre ich hier aufgestanden. – George

+0

Ich habe die Antwort aktualisiert, so dass die Großschreibung jetzt korrekt ist. – chasen

+15

@George RIESIG oder riesig? : D – m93a

2

War heute mit jemand anderem Code runden das Hantieren und fand die folgenden, die Runden nach unten als auch scheint:

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

Für weitere Informationen über das Sign-ausbreitende Verschiebung nach rechts (>>), siehe MDN Bitwise Operators

Es dauerte eine Weile, um herauszufinden, was das tut: D

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

+1

Es tötet auch still Ihre Nummer, wenn es nicht in 32 Bits passt. Chrom-Konsole: 99999999999999999999999 | 0 => -167772160 –

16

Sie können versuchen, diese Funktion zu nutzen, wenn Sie auf eine bestimmte Anzahl von Dezimalstellen runden 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 
+0

Ich denke, ein Einliner wie dieser benötigt keine Funktion. –

+0

RoundDown (4.56, 2) gibt Ihnen 4,55, also glaube ich nicht, dass es eine gute Lösung ist. – cryss

6

abrunden auf negative Unendlichkeit, zu verwenden:

rounded=Math.floor(number); 

Abzurunden in Richtung Null (wenn die Zahl auf eine 32-Bit-Ganzzahl zwischen zwei runden kann) en -2147483648 und 2147483647), zu verwenden:

rounded=number|0; 

gegen Null abrunden (für eine beliebige Anzahl), zu verwenden:

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

ein number Richtung 0 Rundung kann durch Subtraktion seiner unterzeichnet Bruchteil erfolgen number % 1:

rounded = number - number % 1; 

Wie Math.floor (Runden in Richtung -Infinity) diese Methode perfekt ist genau.

Es gibt Unterschiede in der Handhabung von -0, +Infinity und -Infinity aber:

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

Sie setzen müssen -1 bis rund die Hälfte nach unten und nach unten unten mit -1 wie das Beispiel 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> 
Verwandte Themen