Es wird alles nach dem Dezimalpunkt entfernt, da die bitweisen Operatoren ihre Operanden implizit in vorzeichenbehaftete 32-Bit-Ganzzahlen konvertieren. Dies funktioniert unabhängig davon, ob die Operanden (Gleitkomma-) Zahlen oder Zeichenfolgen sind und das Ergebnis eine Zahl ist.
Mit anderen Worten, es ergibt sich:
function(x) {
if(x < 0) return Math.ceil(x);
else return Math.floor(x);
}
Nur wenn x zwischen - (2 31 ) und 2 31 - 1 liegt. Andernfalls tritt ein Überlauf auf und die Zahl wird "umbrochen".
Dies kann als nützlich angesehen werden, um das String-Argument einer Funktion in eine Zahl umzuwandeln, aber sowohl wegen der Möglichkeit eines Überlaufs als auch weil es für die Verwendung mit Nicht-Ganzzahlen falsch ist, würde ich es nicht so verwenden, außer für "Code Golf" ( dh sinnloses Abschneiden von Bytes aus dem Quellcode Ihres Programms auf Kosten der Lesbarkeit und Robustheit). Ich würde +xoder Number(x)stattdessen verwenden.
Wie das das NICHT des NICHT ist
Die Nummer -43.2 lautet zum Beispiel:
-43,2 10 = 11111111111111111111111111010101 2
als vorzeichenbehaftete 32-Bit-Binärzahl (Zweierkomplement). (JavaScript ignoriert, was nach dem Dezimalpunkt steht.) Das Invertieren der Bits ergibt:
NICHT -43 10 = 00000000000000000000000000101010 2 = 42 10
Wieder invertieren ergibt:
NICHT 42 10 = 11111111111111111111111111010101 2 = -43 10
Dies unterscheidet sich davon, Math.floor(-43.2)dass negative Zahlen gegen Null gerundet werden und nicht davon entfernt sind. (Die Floor-Funktion, die gleich -44 wäre, rundet immer auf die nächstniedrigere Ganzzahl ab, unabhängig davon, ob die Zahl positiv oder negativ ist.)