Wie kann ich den Dezimalteil aus der JavaScript-Nummer entfernen?

218

Ich habe die Ergebnisse einer Division und möchte den Dezimalteil der resultierenden Zahl verwerfen.

Wie kann ich das machen?

JacobTheDev
quelle

Antworten:

384

Du könntest benutzen...

... abhängig davon, wie Sie die Dezimalstelle entfernen wollten.

Math.trunc()wird noch nicht auf allen Plattformen unterstützt (nämlich IE), aber Sie können in der Zwischenzeit problemlos eine Polyfüllung verwenden .

Eine andere Methode zum Abschneiden des Bruchteils mit hervorragender Plattformunterstützung ist die Verwendung eines bitweisen Operators (.eg |0). Der Nebeneffekt der Verwendung eines bitweisen Operators für eine Zahl besteht darin, dass der Operand als vorzeichenbehaftete 32-Bit-Ganzzahl behandelt wird, wodurch die gebrochene Komponente entfernt wird. Beachten Sie, dass dadurch auch Zahlen größer als 32 Bit entstellt werden.


Möglicherweise sprechen Sie auch über die Ungenauigkeit der Dezimalrundung mit Gleitkomma-Arithmetik.

Erforderliche Lektüre - Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte .

Alex
quelle
29
Beachten Sie, dass Math.floor()wird erhöhen numerischen Wert , wenn Zahl negativ . Also Math.floor(-1.2) -> -2während Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( Wie durch @FloydPink erwähnt ) wird Dezimalteil verwerfen , wie erwartet sowohl für positive und negative Zahlen.
Paul T. Rawkeen
1
@ PaulT.Rawkeen Sie können den Dezimalteil auch mit einem bitweisen Operator löschen. Beachten Sie jedoch, dass er auch auf 32 Bit abgeschnitten wird.
Alex
2
Das Folgende zeigt, dass diese Antwort instabil ist:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake
4
@Jake Das Ergebnis von 2.3*100in Javascript ist 229.99999999999997, also scheint es , dass der bitweise Operator seine Arbeit in Ihrem Beispiel korrekt macht.
Chad von Nau
Gibt es eine ähnliche Lösung wie |064-Bit-Ganzzahlen?
Clint
49

Sie können auch bitweise Operatoren verwenden, um die Dezimalstelle abzuschneiden.

z.B

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Bitweise Operationen sind wesentlich effizienter als die mathematischen Funktionen. Der doppelte nicht bitweise Operator scheint auch die x | 0und x << 0bitweisen Operationen geringfügig zu übertreffen .

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Erwähnenswert ist auch, dass der bitweise Nicht-Operator Vorrang vor arithmetischen Operationen hat. Daher müssen Sie möglicherweise Berechnungen mit Klammern umgeben, um das gewünschte Ergebnis zu erzielen:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Weitere Informationen zum Operator double bitwise not finden Sie unter Double bitwise NOT (~~)

Braden Steffaniak
quelle
2
Könnte geringfügig effizient sein. Aber ich würde 'Math'-Funktionen vorschlagen, da es besser lesbar ist.
Ashipj
Möglicherweise funktioniert dies nicht, wenn die Ganzzahl nicht als vorzeichenbehaftete 32-Bit-Ganzzahlen dargestellt wird ( stackoverflow.com/a/7488075/3655192 )
Hiroki,
30

Sie könnten auch tun

parseInt(a/b)
Hari Pachuveetil
quelle
17
Beachten Sie, dass dies parseIntbei großen Zahlen nicht zuverlässig funktioniert, da zuerst das Argument in eine Zeichenfolge konvertiert wird und bei großen Zahlen das Ergebnis die Exponentialschreibweise verwendet. Zum Beispiel: var n = 22222222222222222222222; parseInt(n);wird zurückgegeben 2, weil n.toString()zurückgegeben wird 2.2222222222222223e+22.
2
Es wird auch nicht parseInt()für seinen Zweck verwendet, nämlich eine Zahl in einer Zeichenfolge zu nehmen und a zurückzugeben Number.
Alex
22

Sie können auch eine bestimmte Anzahl von Ziffern nach dem Dezimalpunkt (hier 2 Ziffern) mit folgendem Code anzeigen:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string

Mahdi Ghafoorian
quelle
4
Beachten Sie, dass toFixed () einen String und keine Zahl zurückgibt. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote
1
Wie ist dies eine Antwort als OP, die darum bittet, den Dezimalteil zu entfernen
Isaac
3
Obwohl eine Zeichenfolge zurückgegeben wird, können Sie diese einfach mit der Number () -Methode korrigieren. Number ((15.46974) .toFixed (2))
iPzard
13

Verwenden Sie Math.round()Funktion.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Navdeep Singh
quelle
17
Der Vollständigkeit halber ist dies einfaches JavaScript, keine Abfrage.
Dave Newton
1
$.round = Math.round;)
Alex
12

Verwenden Sie Math.round().

(Alex 'Antwort ist besser; ich habe eine Annahme gemacht :)

Dave Newton
quelle
6

Mit ES2015 ist Math.trunc () verfügbar.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Es wird in IE11 oder niedriger nicht unterstützt, funktioniert jedoch in Edge und jedem anderen modernen Browser.

Chad von Nau
quelle
2
Kennen Sie Variationen, die das Abschneiden auf X Dezimalstellen ermöglichen? Wäre es naiv zu glauben, dass Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)das funktionieren würde?
Jamiebarrow
2
Hey Jamie, es sieht so aus, als würde das in den meisten Fällen funktionieren, aber es ist anfällig für Gleitkomma-Fallstricke. zB value = 2.3und x = 2wird zurückkehren 2.29. Ich habe keinen besseren Vorschlag.
Chad von Nau
Das klingt für mich nach der richtigen Antwort. Keine Rundung oben oder unten. Keine Probleme mit negativen Zahlen. Verwerfen Sie einfach die Dezimalstelle. Da wurde die Frage gestellt.
Enrique Moreno Zelt
2

Wenn Sie sich nicht für das Rouding interessieren, konvertieren Sie einfach die Zahl in eine Zeichenfolge und entfernen Sie alles nach dem Punkt, einschließlich des Punkts. Dies funktioniert unabhängig davon, ob eine Dezimalstelle vorhanden ist oder nicht.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];
Helzgate
quelle
1

toFixed verhält sich wie rund.

Verwenden Sie für ein bodenähnliches Verhalten%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3
Shahar H.
quelle
2
Warum ist dies Ihrer Meinung nach besser als die Verwendung von Math.floor? Ihre Lösung erscheint unnötig komplex und langsam. Ich weiß nicht, wie Math.floor funktioniert, aber ich erwarte, dass es viel optimierter wird. Ich frage mich auch, ob Ihre Lösung möglicherweise unter Gleitkomma-Rundungsfehlern leidet.
Hans Roerdinkholder
1

Hier ist die komprimierende ausführliche Erklärung mit Hilfe der obigen Beiträge:

1. Math.trunc (): Hiermit werden die Ziffern entfernt, auf die ein Punkt folgt. Es konvertiert implizit. Wird im IE jedoch nicht unterstützt.

Beispiel:

Math.trunc (10.5) // 10

Math.trunc (-10,5) // -10

Andere alternative Möglichkeit: Verwendung des bitweisen Nicht-Operators:

Beispiel:

x = 5,5

~~ x // 5

2. Math.floor (): verwendet, um den minimalen möglichen ganzzahligen Wert anzugeben. Es wird in allen Browsern unterstützt.

Beispiel:

Math.floor (10.5) // 10

Math.floor (-10,5) // -11

3. Math.ceil (): verwendet, um den höchstmöglichen ganzzahligen Wert . Es wird in allen Browsern unterstützt.

Beispiel:

Math.ceil (10.5) // 11

Math.ceil (-10,5) // -10

4. Math.round (): Es wird auf die nächste Ganzzahl gerundet. Es wird in allen Browsern unterstützt.

Beispiel:

Math.round (10.5) // 11

Math.round (-10,5) // -10

Math.round (10.49) // 10

Math.round (-10,51) // -11

Sreepurna
quelle
0

Verwenden Sie für eine ES6-Implementierung Folgendes:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}
Jared
quelle
0

Dies ist für diejenigen gedacht, die verhindern möchten, dass Benutzer Dezimalzahlen eingeben

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>
Masoud Darvishian
quelle
0

Mit .toFixed (0) können Sie den vollständigen Dezimalteil entfernen oder die Zahl in Argumenten angeben, bis zu denen die Dezimalstelle abgeschnitten werden soll.

Hinweis: toFixed konvertiert die Zahl in eine Zeichenfolge.

Nikhil Kamani
quelle
0

Beispielsweise:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

oder

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
kelly k audrey
quelle