In JavaScriptwie bekomme ich:
- Wie oft eine bestimmte Ganzzahl in eine andere übergeht?
- Der Rest?
Yarin
In JavaScriptwie bekomme ich:
Markus Elliot
Für irgendeine Zahl y
und ein Teiler x
Berechnen Sie den Quotienten (quotient
) und Rest (remainder
) wie:
var quotient = Math.floor(y/x);
var remainder = y % x;
% arbeitet mit Floats in JavaScript (dies unterscheidet sich von vielen anderen Sprachen), was vielleicht nicht erwünscht ist: 3.5 % 2
bewertet mit 1,5. Stellen Sie sicher, dass Sie (parseInt, floor usw.) wie erforderlich handhaben
– Benutzer166390
19. November 10 um 19:09 Uhr
Der ganzzahlige Teil von -4,5 in der Mathematik ist -5, da -5 die “höchstmögliche ganze Zahl ist, die noch kleiner als -4,5 ist”.
– Zäh
3. Dezember 14 um 13:40 Uhr
Was auch immer Sie bei negativen Zahlen tun, es sollte für den Quotienten und den Rest konsistent sein. Verwenden floor
und %
zusammen ist in dieser Weise nicht konsistent. Entweder verwenden trunc
anstatt floor
(wodurch negative Reste zugelassen werden) oder verwenden Sie die Subtraktion, um den Rest zu erhalten (rem = y - div * x
).
– Mark Reed
17. Februar 16 um 19:31 Uhr
1. Wenn Sie den Rest berechnen rem
trotzdem kannst du den Quotienten bekommen div
schneller ohne Bodenbelag: (y - rem) / x
. 2. Übrigens ist die Modulo-Operation nach der von Donald Knuth empfohlenen Definition (Vorzeichen-Übereinstimmungen-Divisor, nicht der Rest, dh der euklidische Modulus, noch die JavaScript-Vorzeichen-Übereinstimmungen-Dividende) das, was wir in JavaScript codieren können function mod (a, n) { return a % n + (Math.sign(a) !== Math.sign(n) ? n : 0); }
.
– Aaron Mansheim
6. Februar 17 um 17:25 Uhr
-9 / 2 = -4,5. Sie nehmen dann den Boden von -4,5, was -5 ist. Denken Sie daran, dass -5 kleiner als -4,5 ist und die Bodenoperation als die größte ganze Zahl kleiner als ein bestimmter Wert definiert ist.
– Mark Reed
21. August 17 um 22:57 Uhr
Benutzer113716
Ich bin kein Experte für bitweise Operatoren, aber hier ist eine andere Möglichkeit, die ganze Zahl zu erhalten:
var num = ~~(a / b);
Dies funktioniert auch für negative Zahlen, während Math.floor()
wird in die falsche Richtung runden.
Das scheint auch richtig zu sein:
var num = (a / b) >> 0;
Ein anderer, dessen Zweck ich gerade die letzten 20 Minuten damit verbracht habe, herauszufinden, ist anscheinend a/b | 0
– BlueRaja – Danny Pflughöft
25. März 11 um 22:42 Uhr
@user113716 @BlueRaja Bitweise Operationen sind nur bei Integer-Typen sinnvoll und JS weiß das (natürlich). ~~int
, int | 0
und int >> 0
ändert das anfängliche Argument nicht, sondern lässt den Interpreter einen integralen Teil an den Operator übergeben.
– Aleksei Zabrodskii
15. Juli 12 um 15:15 Uhr
floor
seinem Namen nach kaum in die falsche Richtung – nur nicht in die Richtung, die die Leute im Allgemeinen wollen!
– Mark K. Cowan
19. Dezember 13 um 0:34 Uhr
Das ist ein buu buu. a = 12447132275286670000; b = 128
Math.floor(a/b)
-> 97243220900677100
und ~~(a/b)
-> -1231452688
.
– Mirek Russin
26. März 14 um 13:03 Uhr
Seien Sie vorsichtig mit Vorrang. ~~(5/2) --> 2
ebenso wie (5/2)>>0 --> 2
aber ~~(5/2) + 1 --> 3
während ~~(5/2)>>0 + 1 --> 1
. ~~
ist eine gute Wahl, da der Vorrang angemessener ist.
– Timkay
29. Mai ’14 um 3:36 Uhr
KalEl
Ich habe einige Geschwindigkeitstests mit Firefox durchgeführt.
-100/3 // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34, 0.5016 millisec
~~(-100/3) // -33, 0.3619 millisec
(-100/3>>0) // -33, 0.3632 millisec
(-100/3|0) // -33, 0.3856 millisec
(-100-(-100%3))/3 // -33, 0.3591 millisec
/* a=-100, b=3 */
a/b // -33.33..., 0.4863 millisec
Math.floor(a/b) // -34, 0.6019 millisec
~~(a/b) // -33, 0.5148 millisec
(a/b>>0) // -33, 0.5048 millisec
(a/b|0) // -33, 0.5078 millisec
(a-(a%b))/b // -33, 0.6649 millisec
Das Obige basiert auf jeweils 10 Millionen Versuchen.
Fazit: Benutzen (a/b>>0)
(oder (~~(a/b))
oder (a/b|0)
) um etwa 20 % Effizienzgewinn zu erzielen. Denken Sie auch daran, dass sie alle unvereinbar sind Math.floor
Wenn a/b<0 && a%b!=0
.
Ich finde, Math.floor() hat eine stabilere Leistung als andere. es ist weniger auf und ab
– Heinrich Leu
12. September 13 um 10:53 Uhr
Beachten Sie, dass die Optimierung der ganzzahligen Division für Geschwindigkeit nur dann sinnvoll wäre, wenn Sie dies tun viel. In jedem anderen Fall würde ich empfehlen, die einfachste zu wählen (je nachdem, was Ihnen und Ihren Kollegen am einfachsten erscheint).
– mik01aj
8. Januar 14 um 14:49 Uhr
@m01 stimme voll und ganz zu – es gibt online viel zu viel Fokus auf solche Sachen
– JonnyRaa
17. September 14 um 13:32 Uhr
@m01 Aber was ist schwieriger: etwas darüber lernen Math.floor
und die wer-weiß-wie-vielen anderen API-Funktionen oder das Lernen über die ~
(bitwise-not) Operator und wie bitweise Operationen in JS und dann funktionieren Verstehen die Wirkung von Doppel-Tilde?
– Stijn de Witt
27. November 15 um 20:53 Uhr
Nun, wenn Ihre Kollegen keine Chips in Assembler programmieren, werden sie es wahrscheinlich verstehen Math.floor
besser. Und selbst wenn nicht, ist dieser hier googlebar.
– mik01aj
28. November 15 um 14:38 Uhr
Oriol
ES6 stellt das Neue vor Math.trunc
Methode. Dies ermöglicht es, die Antwort von @ MarkElliot so zu korrigieren, dass sie auch für negative Zahlen funktioniert:
var div = Math.trunc(y/x);
var rem = y % x;
Beachten Sie, dass Math
Methoden haben gegenüber bitweisen Operatoren den Vorteil, dass sie mit Zahlen über 2 arbeiten31.
Wolf Elkan
Ich benutze normalerweise:
const quotient = (a - a % b) / b;
const remainder = a % b;
Es ist wahrscheinlich nicht das eleganteste, aber es funktioniert.
Schöne Lösung, weil es die Hässlichkeit des Analysierens oder Abschneidens eines Floats vermeidet.
– Dem Pilafian
20. März 19 um 0:11 Uhr
Wenn Sie sowohl Quotient als auch Rest benötigen, berechnen Sie zuerst den Rest und verwenden Sie diesen Wert dann im Ausdruck für den Quotienten wieder, dh Quotient = (a – Rest) / b;
– gb96
4. April 19 um 3:33 Uhr
Rest = a % b; Quotient = (a – Rest) / b;
– Zv_oDD
30. Oktober 19 um 1:21 Uhr
gammax
var remainder = x % y;
return (x - remainder) / y;
Schöne Lösung, weil es die Hässlichkeit des Analysierens oder Abschneidens eines Floats vermeidet.
– Dem Pilafian
20. März 19 um 0:11 Uhr
Wenn Sie sowohl Quotient als auch Rest benötigen, berechnen Sie zuerst den Rest und verwenden Sie diesen Wert dann im Ausdruck für den Quotienten wieder, dh Quotient = (a – Rest) / b;
– gb96
4. April 19 um 3:33 Uhr
Rest = a % b; Quotient = (a – Rest) / b;
– Zv_oDD
30. Oktober 19 um 1:21 Uhr
Sie können die Funktion verwenden parseInt
um ein abgeschnittenes Ergebnis zu erhalten.
parseInt(a/b)
Um einen Rest zu erhalten, verwenden Sie den Mod-Operator:
a%b
parseInt hat einige Fallstricke mit Zeichenfolgen, um die Verwendung des Radix-Parameters mit der Basis 10 zu vermeiden
parseInt("09", 10)
In einigen Fällen kann die Zeichenfolgendarstellung der Zahl eine wissenschaftliche Notation sein, in diesem Fall erzeugt parseInt ein falsches Ergebnis.
parseInt(100000000000000000000000000000000, 10) // 1e+32
Dieser Aufruf liefert als Ergebnis 1.
parseInt
sollte nach Möglichkeit vermieden werden. Hier ist die Warnung von Douglas Crockford: „Wenn das erste Zeichen des Strings 0 ist, dann wird der String zur Basis 8 statt zur Basis 10 ausgewertet. In der Basis 8 sind 8 und 9 keine Ziffern, also parseInt(“08”) und parseInt (“09”) als Ergebnis 0. Dieser Fehler verursacht Probleme in Programmen, die Datums- und Zeitangaben parsen. Glücklicherweise kann parseInt einen Radix-Parameter annehmen, sodass parseInt(“08″, 10) 8 ergibt. Ich empfehle Ihnen, dies immer zu tun Geben Sie den Radix-Parameter an.” archive.oreilly.com/pub/a/javascript/excerpts/…
– Befugnisse
2. November 15 um 4:56 Uhr
In einer Division erwarte ich eine Zahl, keine Zeichenfolge, aber das ist ein guter Punkt.
– Édipo Costa Rebouças
24. November 15 um 22:26 Uhr
@Powers, also füge den Radix hinzu. Er sagt es nicht parseInt
sollte vermieden werden; Nur, dass es einige Fallstricke gibt, die man beachten sollte. Sie müssen sich dieser Dinge bewusst sein und bereit sein, damit umzugehen.
– Keiner
22. Dezember 15 um 15:03 Uhr
Niemals anrufen parseInt
mit Zahlenargument. parseInt
soll teilweise numerische Zeichenfolgen analysieren und keine Zahlen abschneiden.
– Oriol
16. Juni 16 um 16:43 Uhr
Nur weil Dinge ursprünglich nicht für eine bestimmte Verwendung gedacht sind, heißt das nicht, dass Sie es nicht tun sollten. Diese Antwort funktioniert.
– fregante
25. März 17 um 2:24 Uhr
.