Wie führt man in JavaScript eine ganzzahlige Division durch und erhält den Rest separat?

Lesezeit: 6 Minuten

Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
Yarin

In JavaScriptwie bekomme ich:

  1. Wie oft eine bestimmte Ganzzahl in eine andere übergeht?
  2. Der Rest?

Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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

1643914507 702 Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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 --> 2aber ~~(5/2) + 1 --> 3während ~~(5/2)>>0 + 1 --> 1. ~~ ist eine gute Wahl, da der Vorrang angemessener ist.

    – Timkay

    29. Mai ’14 um 3:36 Uhr


1643914508 209 Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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.floorWenn 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

1643914508 222 Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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.

1643914509 54 Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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

1643914509 73 Wie fuhrt man in JavaScript eine ganzzahlige Division durch und
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

.

758910cookie-checkWie führt man in JavaScript eine ganzzahlige Division durch und erhält den Rest separat?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy