Wie kann überprüft werden, ob der angegebene Wert eine positive oder negative Ganzzahl ist?

76

Nehmen wir an, ich habe den Wert 10 einer Variablen zugewiesen.

var values = 10;

und ich möchte eine bestimmte Funktion ausführen, wenn der Wert positiv ist

if(values = +integer){ 
    //do something with positive 
} else { 
    //do something with negative values 
}

Wie würde dies erreicht werden?

Xavier
quelle
Ich gehe davon aus, dass Sie die Variable inkrementieren / dekrementieren. Wenn ja, warum schreiben Sie keine if-Bedingung, um den Wert nach dem Inkrementieren / Dekrementieren der Variablen zu überprüfen?
Sagar V
12
Diese Frage wurde positiv bewertet - ich hatte heute einen Mega-Hirnfurz und versuchte herauszufinden, ob eine Zahl in Javascript heute positiv oder negativ war. Ich denke, es ist an der Zeit, eine Pause von der Programmierung zu machen .....
jedd.ahyoung
Diese Frage hätte 2011 wirklich großartig sein sollen.
göttlich

Antworten:

177
if (values > 0) {
    // Do Something
}
Peter Kelly
quelle
2
Ich möchte nur einen Kommentar hinzufügen: Mir ist aufgefallen, dass bei der ursprünglichen Frage nicht nur gefragt wurde, ob der Wert positiv ist, sondern ob es sich um eine positive Ganzzahl handelt . Um die zweite Anforderung zu erfüllen, habe ich eine neue Antwort erstellt
stevendesu
Beachten Sie Zahlen wie -2.2737367544323206e-13 (dh: fast Null). Ich dachte, diese Diskussion ist interessant: stackoverflow.com/questions/588004/…
thicolares
3
Diese Antwort prüft nicht, ob der Wert eine positive ganze Zahl ist, wobei die ganze Zahl eine ganze Zahl und kein Bruch ist
Reinsbrain
1
Nur eine Anmerkung hier: versucht , das heute zu sehen , ob ich eine positive Zahl (int oder float) haben und es auch ausgewertet truefür values=true. Also ... überprüfe, ob valueses tatsächlich ein Boolescher Wert ist!
Wullxz
23

Um nur zu überprüfen, dies ist anscheinend der schnellste Weg:

var sign = number > 0 ? 1 : number == 0 ? 0 : -1; 
//Is "number": greater than zero? Yes? Return 1 to "sign".
//Otherwise, does "number" equal zero?  Yes?  Return 0 to "sign".  
//Otherwise, return -1 to "sign".

Hier erfahren Sie, ob das Vorzeichen positiv ist (Rückgabe 1) oder gleich Null ist (Rückgabe 0) , andernfalls (Rückgabe -1) . Dies ist eine gute Lösung, da 0 nicht positiv und nicht negativ ist, aber es kann Ihre Variable sein.

Fehlversuch:

var sign = number > 0 ? 1 : -1;

... zählt 0 als negative ganze Zahl , was falsch ist.

Wenn Sie versuchen, Bedingungen einzurichten, können Sie diese entsprechend anpassen. Hier sind zwei analoge Beispiele für eine if / else-if-Anweisung:

Beispiel 1:

number = prompt("Pick a number?");
if (number > 0){
  alert("Oh baby, your number is so big!");}
else if (number == 0){
  alert("Hey, there's nothing there!");}
else{
  alert("Wow, that thing's so small it might be negative!");}

Beispiel 2:

number = prompt("Pick a number?");

var sign = number > 0 ? 1 : number == 0 ? 0 : -1;

if (sign == 1){
  alert("Oh baby, your number is so big!" + " " + number);}
else if (sign == 0){
  alert("Hey, there's nothing there!" + " " + number);}
else if (sign == -1){
  alert("Wow, that thing's so small it might be negative!" + " " + number);}
Wolfpack'08
quelle
22

Bin ich der einzige, der dies gelesen hat und festgestellt hat, dass keine der Antworten den "ganzzahligen" Teil der Frage betrifft?

Das Problem

var myInteger = 6;
var myFloat = 6.2;
if( myInteger > 0 )
    // Cool, we correctly identified this as a positive integer
if( myFloat > 0 )
    // Oh, no! That's not an integer!

Die Lösung

Um sicherzustellen, dass es sich um eine Ganzzahl handelt, möchten Sie Ihren Wert in eine Ganzzahl umwandeln und dann mit sich selbst vergleichen.

if( parseInt( myInteger ) == myInteger && myInteger > 0 )
    // myInteger is an integer AND it's positive
if( parseInt( myFloat ) == myFloat && myFloat > 0 )
    // myFloat is NOT an integer, so parseInt(myFloat) != myFloat

Einige nette Optimierungen

Als Bonus gibt es einige Verknüpfungen zum Konvertieren von einem Float in eine Ganzzahl in JavaScript . In JavaScript sind alle Bit - Operatoren ( |, ^, &, usw.) Ihre Zahl auf eine ganze Zahl gegossen vor dem Betrieb. Ich gehe davon aus, dass 99% der Entwickler den IEEE-Gleitkomma-Standard nicht kennen und schrecklich verwirrt wären, wenn "200 | 2" auf 400 (ish) ausgewertet würde. Diese Verknüpfungen werden in der Regel schneller als Math.flooroder ausgeführt parseIntund benötigen weniger Byte, wenn Sie versuchen, den kleinstmöglichen Code herauszuholen:

if( myInteger | 0 == myInteger && myInteger > 0 )
    // Woot!
if( myFloat | 0 == myFloat && myFloat > 0 )
    // Woot, again!

Aber warte, da ist noch mehr!

Diese bitweisen Operatoren arbeiten mit 32-Bit-Ganzzahlen mit Vorzeichen. Dies bedeutet, dass das höchste Bit das Vorzeichenbit ist. Wenn Sie das Vorzeichenbit auf Null setzen, bleibt Ihre Zahl nur dann unverändert , wenn sie positiv war . Sie können dies verwenden, um mit einem einzigen Schlag die Positivität UND Integrität zu überprüfen:

// Where 2147483647 = 01111111111111111111111111111111 in binary
if( (myInteger & 2147483647) == myInteger )
    // myInteger is BOTH positive and an integer
if( (myFloat & 2147483647) == myFloat )
    // Won't happen
* note bit AND operation is wrapped with parenthesis to make it work in chrome (console)

Wenn Sie Probleme haben, sich an diese verschlungene Zahl zu erinnern, können Sie sie auch vorher als solche berechnen:

var specialNumber = ~(1 << 31);

Auf Negative prüfen

Gemäß dem Kommentar von @ Reinsbrain kann ein ähnlicher bitweiser Hack verwendet werden, um nach einer negativen Ganzzahl zu suchen . In einer negativen Zahl, wir tun wollen , dass die am weitesten links gelegene Bit a 1, um so durch diesen Bit auf 1 zwingen die Zahl bleibt nur unverändert , wenn sie negativ zu beginnen sind:

// Where -2147483648 = 10000000000000000000000000000000 in binary
if( (myInteger | -2147483648) == myInteger )
    // myInteger is BOTH negative and an integer
if( (myFloat | -2147483648) == myFloat )
    // Won't happen

Diese spezielle Zahl ist noch einfacher zu berechnen:

var specialNumber = 1 << 31;

Randfälle

Wie bereits erwähnt, schlagen Zahlen, die nicht in 32-Bit (mehr als ~ 2 Milliarden) passen, fehl, da bitweise JavaScript-Operatoren in 32-Bit-Ganzzahlen konvertieren

Sie können auf die längere Lösung für diese zurückgreifen:

if( parseInt(123456789000) == 123456789000 && 123456789000 > 0 )

Selbst diese Lösung schlägt jedoch irgendwann fehl, da parseIntihre Genauigkeit für große Zahlen begrenzt ist. Versuchen Sie Folgendes und sehen Sie, was passiert:

parseInt(123123123123123123123); // That's 7 "123"s

Auf meinem Computer in der Chrome-Konsole wird Folgendes ausgegeben: 123123123123123130000

Der Grund dafür ist, dass parseInt die Eingabe wie einen 64-Bit-IEEE-Float behandelt. Dies liefert nur 52 Bits für die Mantisse, was einen Maximalwert von ~ 4,5e15 bedeutet, bevor sie mit dem Runden beginnt

stevendesu
quelle
Ich sollte beachten, dass dies nicht für ganze Zahlen größer als 2147483647 funktioniert. Zum Beispiel:99999999999 & 2147483647 = 1215752191
stevendesu
Tatsächlich fragt die Frage nicht, ob es sich um einen Ganzzahltyp handelt und ob diese Ganzzahl positiv ist. Es wird gefragt, ob 'var values ​​= 10' eine positive Ganzzahl ist, wie im bereitgestellten Code gezeigt, mit dem wir nur arbeiten können.
Peter Kelly
2
@ PeterKelly, ich fürchte, ich verstehe wirklich nicht, wie mehrdeutig die Frage war. Er sagte: "Wie kann man überprüfen, ob der angegebene Wert eine positive oder negative Ganzzahl ist? " - und jede Antwort antwortete auf den "positiven" Teil, aber nicht auf den "ganzzahligen" Teil. Wenn nichts anderes meine Antwort eine gültige Lösung für sein Problem und eine gute Lektion in JavaScript ist, verdient sie wahrscheinlich keine Abwertung.
Stevendesu
1
@stevendesu ist richtig. Die Ganzzahl ist Teil der Frage.
Mohamed Anis Dahmani
2
@stevendesu Dies sollte die akzeptierte Antwort sein, insbesondere wenn Sie die Antwort ändern können, um auch Fälle negativer Ganzzahlen zu behandeln. gute Arbeit und danke für das tolle Beispiel
Reinsbrain
13

Ich dachte hier, du wolltest die Aktion machen, wenn sie positiv ist.

Dann würde vorschlagen:

if (Math.sign(number_to_test) === 1) {
     function_to_run_when_positive();
}
Mickey Puri
quelle
2
Die einzig richtige Antwort, wenn es um positive / negative Zahlen geht.
DBF
Beste Antwort! Gültig für alle Nummerntypen.
Felansu
1
Nur zu Ihrer Information, Math.sign () wird in IE 11 oder früher nicht unterstützt
Justin Jones
Math.sign Dokumentation fyi.
kristinadavidovic
7

schreibe einfach:

if(values > 0){
//positive
}
else{
//negative
}
Ankit
quelle
7

1 Auf positiven Wert prüfen

In Javascript gibt uns ein einfacher Vergleich wie: Wert> == 0 aufgrund der Existenz von -0 und +0 keine Antwort. (Dieses Konzept hat seine Wurzeln in abgeleiteten Gleichungen.) Nachfolgendes Beispiel für diese Werte und ihre Eigenschaften:

var negativeZero = -0;
var negativeZero = -1 / Number.POSITIVE_INFINITY;
var negativeZero = -Number.MIN_VALUE / Number.POSITIVE_INFINITY;

var positiveZero = 0;
var positiveZero = 1 / Number.POSITIVE_INFINITY;
var positiveZero = Number.MIN_VALUE / Number.POSITIVE_INFINITY;

-0 === +0                     // true
1 / -0                        // -Infinity
+0 / -0                       // NaN
-0 * Number.POSITIVE_INFINITY // NaN

In diesem Sinne können wir eine Funktion wie unten schreiben, um das Vorzeichen der angegebenen Nummer zu überprüfen:

function isPositive (number) {
    if ( number > 0 ) { 
        return true;
    }
    if (number < 0) {
        return false;
    }
    if ( 1 / number === Number.POSITIVE_INFINITY ) {
        return true;
    }
    return false;
}

2a Überprüfen, ob die Zahl eine Ganzzahl ist (im mathematischen Sinne)

Um zu überprüfen, ob diese Zahl eine Ganzzahl ist, können wir die folgende Funktion verwenden:

function isInteger (number) {
    return parseInt(number) === number;
}
//* in ECMA Script 6 use Number.isInteger

2b Überprüfen, ob die Zahl eine Ganzzahl ist (in der Informatik)

In diesem Fall überprüfen wir, ob die Zahl keinen exponentiellen Teil hat (bitte beachten Sie, dass in JS Zahlen im Gleitkommaformat mit doppelter Genauigkeit dargestellt werden). In Javascript ist es jedoch sinnvoller zu überprüfen, ob der Wert "sichere Ganzzahl" ( http) ist : //people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer ) - um es einfach auszudrücken bedeutet dies, dass wir 1 zu "sicherer Ganzzahl" addieren / subtrahieren können und sicher sein können, dass das Ergebnis sein wird das gleiche wie vom Mathematikunterricht erwartet. Um zu veranschaulichen, was ich meine, Ergebnis einiger unsicherer Operationen unten:

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2;          // true
Number.MAX_SAFE_INTEGER * 2 + 1 === Number.MAX_SAFE_INTEGER * 2 + 4;  // true

Ok, um zu überprüfen, ob die Zahl eine sichere Ganzzahl ist, können wir Number.MAX_SAFE_INTEGER / Number.MIN_SAFE_INTEGER und parseInt verwenden, um sicherzustellen, dass die Zahl überhaupt eine Ganzzahl ist.

function isSafeInteger (number) {
    return parseInt(number) === number
    && number <== Number.MAX_SAFE_INTEGER
    && number >== Number.MIN_SAFE_INTEGER
}
//* in ECMA Script 6 use Number.isSafeInteger
Rafal Bartoszek
quelle
+1 Ich denke, dies ist besser als meine Antwort, da es die Randfälle von negativer Null und MAX_SAFE_INTEGER abdeckt. Meine Antwort ergab eine coole und leistungsstarke Kurzhandlösung, die jedoch nur die Randfälle beschönigte.
Stevendesu
6
if(values >= 0) {
 // as zero is more likely positive than negative
} else {

}
Thorben
quelle
5
if ( values > 0 ) {
    // Yeah, it's positive
}
Gustav Barkefors
quelle
5
if ( values > 0 ) {
    //you got a positive value
}else{
    //you got a negative or zero value    
}
Varun
quelle
4

Eine Zahl zu überprüfen ist positiv, negativ oder negativ Null. Überprüfen Sie das Vorzeichen mit der Math.sign () -Methode. Sie erhalten -1, -0,0 und 1 auf der Grundlage positiver negativer und negativer Null- oder Nullzahlen

 Math.sign(-3) // -1
 Math.sign(3) // 1
 Math.sign(-0) // -0
 Math.sign(0) // 0
Amitesh Maurya
quelle
2

Ich weiß, es ist einige Zeit her, aber es gibt eine elegantere Lösung. Aus den Mozilla- Dokumenten :

Math.sign(parseInt(-3))

Sie erhalten -1 für negativ, 0 für null und 1 für positiv.

Marco
quelle
2

Positive ganze Zahl:

if (parseInt(values, 10) > 0) {

}
Ha Ja
quelle
0

Ich benutze in diesem Fall und es funktioniert :)

var pos = 0; 
var sign = 0;
var zero = 0;
var neg = 0;
for( var i in arr ) {
    sign = arr[i] > 0 ? 1 : arr[i] == 0 ? 0 : -1;
    if (sign === 0) {
        zero++; 
    } else if (sign === 1 ) {
        pos++;
    } else {
        neg++;
    }
}
Ezequiel García
quelle
0

Sie sollten zuerst überprüfen, ob der Eingabewert mit der Funktion isNumeric () zusammenfällt. Fügen Sie dann die Bedingung oder größer als 0 hinzu. Dies ist der jQuery-Code dafür.

function isPositiveInteger(n) {
        return ($.isNumeric(n) && (n > 0));
}
Yogihosting
quelle
0

Ausgehend von der Basis, dass der empfangene Wert eine Zahl und keine Zeichenfolge ist, was ist mit der Verwendung Math.abs()? Diese native JavaScript-Funktion gibt den absoluten Wert einer Zahl zurück:

Math.abs(-1) // 1

Sie können es also folgendermaßen verwenden:

var a = -1;
if(a == Math.abs(a)){
    // false 
}

var b = 1;   
if(b == Math.abs(b)){
    // true
}
luissevillano
quelle
0

Sie können den Shifting-Bit-Operator verwenden, aber er möchte den Unterschied zwischen -0und +0ähnlichem feststellen Math.sign(x):

let num = -45;
if(num >> 31 === -1)
    alert('Negative number');
else
    alert('Positive number');

https://jsfiddle.net/obxptgze/

H Aßdøµ
quelle
-1

Zum Überprüfen der positiven Ganzzahl:

var isPositiveInteger = function(n) {
        return ($.isNumeric(n)) && (Math.floor(n) == n) && (n > 0); 
}
Mahesh
quelle