Positive bis negative Zahl in JavaScript?


101

Grundsätzlich ist die Umkehrung von abs. Wenn ich habe:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  slideNum = -slideNum
}
console.log(slideNum)

Egal welche Konsole immer eine positive Zahl zurückgibt. Wie behebe ich das?

Wenn ich mache:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  _selector.animate({
    left: (-slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
} else {
  _selector.animate({
    left: (slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
}

es funktioniert zwar, aber es ist nicht "trocken" und nur dumm, einen ganzen Codeblock NUR für a zu haben -.


4
Ich bin mir sicher, dass es dafür ein jQuery-Plugin gibt.
Jakub Hampl

Antworten:


189
Math.abs(num) => Always positive
-Math.abs(num) => Always negative

Sie erkennen jedoch, dass für Ihren Code

if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum = -slideNum }
console.log(slideNum)

Wenn der gefundene Index 3 ist und slideNum 3 ist,
dann ist 3 <3-1 => false,
so dass slideNum positiv bleibt ?

Es sieht für mich eher nach einem logischen Fehler aus.



29

Die Grundformel, um positiv zu negativ oder negativ zu positiv umzukehren:

i - (i * 2)

32
Was ist los mit i * -1? Ich bin mir auch nicht sicher, ob dies die eigentliche Frage beantwortet.
Andrew Barber

5
Es ist architektonisch abhängig, aber 0 - ich könnte schneller sein
Ben Taliadoros

@ AndrewBarber i * -1scheint in der aktuellen Version von Chrome nicht zu funktionieren. Verwenden Sie -Math.abs (1) nicht sicher, warum dies funktioniert, hoffentlich kann jemand das Warum erweitern.
Philip Rollins

@PhilipRollins i * -1wird immer funktionieren. Ich weiß nicht, wie du es versucht hast, vielleicht hattest du einen Tippfehler. Aber ... was ist falsch daran, i = -ianstatt i = i * -1(oder i *= -1) positiv zu negativ oder negativ zu positiv umzukehren?
Diego ZoracKy

@DiegoZoracKy Das habe ich auch gedacht, aber nicht für die Chrome-Version, die ich verwendet habe, und es hat in Firefox funktioniert, sodass ein Tippfehler nicht in Frage kommt. Ich bin gerade unter Linux, aber Sie können Ihre Theorie auf Chrome testen. Denken Sie daran, dass Chrome automatisch aktualisiert wird, damit bereits Fehlerbehebungen angewendet und neue Fehler an die Community gesendet werden. Dies könnte ein Fehler sein, der nur wenige Tage andauerte und jetzt für immer behoben ist.
Philip Rollins

9

Um eine negative Version einer Zahl in JavaScript zu erhalten, können Sie immer den ~bitweisen Operator verwenden.

Wenn Sie beispielsweise a = 1000ein Negativ konvertieren müssen, müssen Sie Folgendes tun:

a = ~a + 1;

Was zum aSein führen würde -1000.


Ist das schneller als das Multiplizieren mit der negativen 1?
Ryandawkins

Ich bin mir nicht sicher, ob ich ehrlich bin, etwas, das Sie untersuchen müssten.
Benjamin Williams

@ RyanDawkins Dies ist nicht schneller als das Multiplizieren mit -1. Javascript hat keine booleschen Operatoren wie C. Um eine boolesche Operation auszuführen, muss JS zwischen den Typen unter der Haube konvertieren.
Spinlock

2
Warum nicht a = -a?
Diego ZoracKy

Bitweise negiert eine Zahl nicht genau. ~1000ist -1001nicht -1000.
Brentonstrine

7
var x = 100;
var negX = ( -x ); // => -100

1
Bitte fügen Sie einige Erklärungen hinzu, die Ihre Antwort bearbeiten. Vermeiden Sie nur Code-Antworten
GGO

1
@GGO ... Ich bin mir nicht sicher, wie dies nicht bereits klar ist, aber sicher: Durch Hinzufügen des Minuszeichens vor dem Wert und anschließendes Umschließen des Werts in Klammern wird der Wert ausgewertet ... das Ergebnis ist Negation of the Wert.
tpayne84

6

Sind Sie sicher, dass die Kontrolle in den Körper des geht if? Wie in gilt der Zustand im ifjemals? Denn wenn dies nicht der Fall ist, wird der Körper des ifniemals ausgeführt und slideNumbleibt positiv. Ich werde eine Vermutung wagen, dass dies wahrscheinlich das ist, was Sie sehen.

Wenn ich in Firebug Folgendes versuche, scheint es zu funktionieren:

>>> i = 5; console.log(i); i = -i; console.log(i);
5
-5

slideNum *= -1sollte auch funktionieren. Wie sollte Math.abs(slideNum) * -1.


Ich habe es gerade getan if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }und ich bin immer noch positiv in diesem console.log?
Oscar Godson

@Oscar, was Vivin sagt ist, dass $this.find('.pdxslide-activeSlide').index() < slideNum-1das immer falsch ist.
David Tang

4

Wenn Sie keine Lust haben, Math.Abs ​​* -1 zu verwenden, können Sie diese einfache if-Anweisung verwenden: P.

if (x > 0) {
    x = -x;
}

Natürlich können Sie dies zu einer solchen Funktion machen

function makeNegative(number) {
    if (number > 0) {
        number = -number;
    }
}

makeNegative (-3) => -3 makeNegative (5) => -5

Hoffe das hilft! Math.abs wird wahrscheinlich für Sie funktionieren, aber wenn es nicht so wenig ist


Bevor Sie eine Frage beantworten, sollten Sie auch überlegen, wann sie gestellt wurde. Diese Frage ist fast 5 Jahre alt. Wenn sich die Technologie nicht geändert hat und es jetzt eine bessere / angemessenere Antwort gibt, ergibt sich normalerweise kein großer Mehrwert, wenn eine andere Antwort angeboten wird.
Igor

1
Ich persönlich schaue die ganze Zeit über alte Stapelüberlauffragen durch. Sicher, das ist für einen Profi nicht allzu hilfreich, aber vielleicht weiß ein Anfänger den Tipp zu schätzen! Das heißt, der einfachste Weg ist wirklich wie oben - Math.Abs ​​(-3) Wie oben diskutiert, dreht Math.Abs ​​jeden Wert positiv. Dann macht das negative Präfix es negativ
Ash Pettit

Upvoted. Persönlich schätze ich diese Antwort und fand sie wertvoll. Sie können von jedem lernen.
jeremysawesome

3
var i = 10;
i = i / -1;

Ergebnis: -10

var i = -10;
i = i / -1;

Ergebnis: 10

Wenn Sie durch negative 1 teilen, wird Ihre Zahl immer in beide Richtungen umgedreht.



2

Javascript hat dafür einen speziellen Operator: unäre Negation .

TL; DR: Es ist das Minuszeichen!

Um eine Zahl zu negieren, stellen Sie sie einfach so -intuitiv wie möglich voran. Keine Notwendigkeit, eine Funktion zu schreiben, verwendenMath.abs() multiplizieren -1oder den bitweisen Operator verwenden.

Unäre Negation funktioniert mit Zahlenliteralen:

let a = 10;  // a is `10`
let b = -10; // b is `-10`

Es funktioniert auch mit Variablen:

let x = 50;
x = -x;      // x is now `-50`

let y = -6;
y = -y;      // y is now `6`

Sie können es sogar mehrmals verwenden, wenn Sie den Gruppierungsoperator verwenden (auch bekannt als Klammern:

l = 10;       // l is `10`
m = -10;      // m is `-10`
n = -(10);    // n is `-10`
o = -(-(10)); // o is `10`
p = -(-10);   // p is `10` (double negative makes a positive)

Alle oben genannten Funktionen funktionieren auch mit einer Variablen.


1

Verwenden Sie 0 - x

x ist die Zahl, die Sie invertieren möchten


3
-xreicht einfach aus.
Antti Haapala

1
Nur -x ergibt -0. Diese Lösung ist besser, wenn es Nullen geben könnte
Chrismarx

1

Das negative Array wird in ein positives umgewandelt oder umgekehrt

function negateOrPositive(arr) {
    arr.map(res => -res)
};

0

In Vanille-Javascript

if(number > 0)
  return -1*number;

Wo Nummer obige die positive Zahl ist, die Sie konvertieren möchten

Dieser Code wandelt nur positive Zahlen in negative Zahlen um, indem er einfach mit -1 multipliziert wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.