Ich möchte einen Float in JavaScript in eine ganze Zahl konvertieren. Eigentlich möchte ich wissen, wie BEIDE Standardkonvertierungen durchgeführt werden: durch Abschneiden und Runden. Und effizient, nicht durch Konvertieren in einen String und Parsen.
javascript
syntax
mcherm
quelle
quelle
Antworten:
Mathe-Objektreferenz
Beispiele
Positiv Negativ Positiv - Größere Zahlen Negativ - Größere Zahlenquelle
var intValue = ~~floatValue;
. Wenn die Notation für Ihren Geschmack zu dunkel ist, verstecken Sie sie einfach in einer Funktion :function toInt(value) { return ~~value; }
. (Dies konvertiert auch Zeichenfolgen in Ganzzahlen, wenn Sie diesMath.trunc(val);
Kommentar, da dies die akzeptierte Antwort ist2.3 - 2.3 % 1
Bitweiser ODER-Operator
Ein bitweiser oder Operator kann zum Abschneiden von Gleitkommazahlen verwendet werden und funktioniert sowohl für positive als auch für negative Punkte:
Ergebnisse
Leistungsvergleich?
Ich habe einen JSPerf-Test erstellt , der die Leistung vergleicht zwischen:
Math.floor(val)
val | 0
bitweise ODER~~val
bitweise NICHTparseInt(val)
das funktioniert nur mit positiven zahlen. In diesem Fall können Sie sicher bitweise Operationen und
Math.floor
Funktionen verwenden.Wenn Sie jedoch Ihren Code benötigen, um sowohl mit positiven als auch mit negativen Ergebnissen zu arbeiten , ist eine bitweise Operation die schnellste (ODER die bevorzugte). Dieser andere JSPerf-Test vergleicht den gleichen, bei dem es ziemlich offensichtlich ist, dass Math aufgrund der zusätzlichen Vorzeichenprüfung jetzt der langsamste der vier ist.
Hinweis
Wie in den Kommentaren angegeben, arbeiten BITWISE-Operatoren mit vorzeichenbehafteten 32-Bit-Ganzzahlen. Daher werden große Zahlen konvertiert. Beispiel:
quelle
Math.floor()
ist es schneller (zumindest gemäß meiner Ausführung Ihres ersten JSPerf-Tests in Google Chrome, Version 30.0.1599.101), robuster (da es nicht davon abhängt, wie Zahlen in Bits dargestellt werden). was diese bitweise Lösung ändern und möglicherweise brechen kann) und vor allem expliziter.~~
ist besser, weil es ein unärer Operator ist.4.2|0+4
gleich4
aber~~4.2+4
gleich8
Hinweis: Sie können nicht
Math.floor()
als Ersatz für das Abschneiden verwenden, daMath.floor(-3.1) = -4
und nicht-3
!!Ein korrekter Ersatz für Abschneiden wäre:
quelle
Math.trunc(value)
wurde in ECMAScript 6floor
rundet gegen-unendlich,truncate
rundet gegen null. (ceil
Runden in Richtung + unendlich).Ein doppelter bitweiser Nicht- Operator kann verwendet werden, um Floats abzuschneiden. Die anderen Operationen , die Sie erwähnt sind durch
Math.floor
,Math.ceil
undMath.round
.Weitere Details mit freundlicher Genehmigung von James Padolsey.
quelle
<canvas>
Font-Rendering-Engine in JS brauchte . Vielen Dank!Zum Abschneiden:
Für Runde:
quelle
Sie können die parseInt- Methode ohne Rundung verwenden. Seien Sie vorsichtig mit Benutzereingaben aufgrund der Präfixoptionen 0x (hex) und 0 (oktal).
quelle
parseInt(1000000000000000000000, 10);
ergibt sich 1, nicht 1 000 000 000 000 000 000 000. Wie auch immer, die Frage wollte ausdrücklich nicht " in einen String konvertieren und analysieren ", obwohl das relativ gering ist ...;)parseInt()
dass eine Zeichenfolge keine Zahl als erster Parameter erwartet . Wenn Sie diese Ganzzahl übergeben, wird sie in die Zeichenfolge konvertiert1e21
undparseInt
analysiert diese. Daraus1e21
resultiert1
.Bitverschiebung um 0, was einer Division durch 1 entspricht
quelle
>> 0
scheint nur für ganze Zahlen < 2 ^ 31-1 und>>> 0
für ganze Zahlen < 2 ^ 32-1 zu funktionieren . Dies gibt 0 für größere Werte zurückIn Ihrem Fall, wenn Sie am Ende eine Zeichenfolge möchten (um Kommas einzufügen), können Sie auch einfach die
Number.toFixed()
Funktion verwenden, dies führt jedoch eine Rundung durch.quelle
Hier gibt es viele Vorschläge. Das bitweise ODER scheint bei weitem das einfachste zu sein. Hier ist eine weitere kurze Lösung, die auch mit negativen Zahlen unter Verwendung des Modulo-Operators funktioniert. Es ist wahrscheinlich einfacher zu verstehen als das bitweise ODER:
Diese Methode funktioniert auch mit hohen Zahlen, bei denen weder '| 0' noch '~~' noch '>> 0' korrekt funktionieren:
quelle
So abschneiden :
Zum Runden :
quelle
Ein weiterer möglicher Weg - verwenden Sie die XOR-Operation:
Die Priorität von bitweisen Operationen ist geringer als die Priorität von mathematischen Operationen, es ist nützlich. Versuchen Sie es mit https://jsfiddle.net/au51uj3r/
quelle
Wenn Sie sich ein natives
Math
Objekt in JavaScript ansehen , erhalten Sie eine ganze Reihe von Funktionen, mit denen Sie Zahlen und Werte usw. bearbeiten können.Grundsätzlich ist das, was Sie tun möchten, in JavaScript recht einfach und nativ ...
Stellen Sie sich vor, Sie haben die folgende Nummer:
und jetzt, wenn Sie es auf die nächste Zahl abrunden möchten, tun Sie einfach:
und du bekommst:
Wenn Sie es auf die nächste Zahl aufrunden möchten, gehen Sie einfach wie folgt vor:
und du bekommst:
Auch
Math.round
nur auf eine höhere oder niedrigere Zahl abrunden, hängt davon ab, welche näher an der Flotzahl liegt.Sie können auch
~~
hinter der Gleitkommazahl verwenden, um einen Gleitkommawert in eine ganze Zahl umzuwandeln.Sie können es verwenden wie
~~myValue
...quelle
~~
denn wenn die Zahl größer als der Grenzwert für int 32 ist, ändert sich der Wert in den Grenzwert für int 32.quelle
Ich möchte nur darauf hinweisen, dass Sie monetär runden und nicht abschneiden möchten. Es ist viel weniger wahrscheinlich, dass Sie um einen Cent davonkommen, da 4,999452 * 100 gerundet 5 ergibt, eine repräsentativere Antwort.
Vergessen Sie außerdem nicht die Rundung des Bankiers , um der leicht positiven Tendenz entgegenzuwirken, die eine gerade Rundung mit sich bringt - Ihre finanzielle Anwendung erfordert dies möglicherweise.
Gaußsche / Banker-Rundung in JavaScript
quelle
Wenn Sie anglejs verwenden, gehen Sie wie folgt vor: In HTML Template Binding
{{val | number:0}}
es wird val in eine ganze Zahl umwandeln
Gehen Sie mit diesem Link durch docs.angularjs.org/api/ng/filter/number
quelle