Überprüfen Sie, ob eine Zahl eine Dezimalstelle hat / eine ganze Zahl ist


284

Ich suche nach einer einfachen Möglichkeit in JavaScript zu überprüfen, ob eine Zahl eine Dezimalstelle enthält (um festzustellen, ob es sich um eine Ganzzahl handelt). Zum Beispiel,

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}

Antworten:


819

Die Verwendung des Moduls funktioniert:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

Beachten Sie, dass dies unabhängig vom Format auf dem numerischen Wert der Zahl basiert . Es behandelt numerische Zeichenfolgen, die ganze Zahlen mit einem festen Dezimalpunkt enthalten, wie Ganzzahlen:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

10
Ich habe nicht abgestimmt, aber ich würde sagen, es hat etwas mit 20.0 zu tun, hat immer noch einen Dezimalpunkt und erfüllt die oben genannten Anforderungen. +1 von mir trotzdem, weil du mir etwas Neues beigebracht hast :)
Abe Petrillo

7
@Abe: Richtig, obwohl ich das für unwahrscheinlich halte. Es ist unmöglich zu sagen, ob 20.0programmgesteuert ein Dezimalpunkt vorhanden ist, es sei denn, er wird als Zeichenfolge ausgedrückt. Auch keine der anderen Lösungen wurde
Andy E

1
@SREEP: siehe Kommentare oben. 0,00 ist in JavaScript nicht 0,00, wenn es als Zahlenwert dargestellt wird. Es kann als Zeichenfolge ("0,00") dargestellt werden. In diesem Fall lautet die Frage "Überprüfen, ob eine Zeichenfolge eine ganze Zahl ist" anstelle von "Überprüfen, ob eine Zahl eine ganze Zahl ist" .
Andy E

3
@Swanidhi: Was meinst du? Was ist nicht gültig? "10."ist eine ganze Zahl und das Ergebnis ist genau das gleiche wie "10"oder 10.
Andy E

3
Das OP fragt nach der Überprüfung, ob eine NUMMER eine ganze Zahl ist. Er erwähnt nirgends Saiten - in dieser Hinsicht ist Andys Antwort richtig.
Om Shankar

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () ist Teil des ES6-Standards und wird in IE11 nicht unterstützt.

Es gibt false zurück , für NaN, Infinityund nicht-numerische Argumente während x % 1 != 0gibt true zurück.


2
Lösung schlägt für 12.0 fehl
Vikas Arora

@ VikasArora Nein, es funktioniert wie vorgesehen. Number.isInteger(12.0)kehrt zurück true.
le_m

Dies scheint die richtige Antwort zu sein, aber leider funktioniert es nicht für die wissenschaftliche Notation, z. B. Number.isInteger('1e3')ist es false, obwohl Number.isInteger(1e3)es wahr ist. Unter der Annahme die Absicht der Frage ist , nicht-ganzzahlige Werte ( und nicht die tatsächliche Anwesenheit eines Dezimalpunktes in der Darstellung) zu finden, dann wird der String - Wert '12 .0' sollte passieren , da es eine ganze Zahl darstellt, aber auch hier Number.isInteger('12.0')ist false.
Brianmearns

Die Frage von @brianmearns OP ist, ob a numberganz ist oder nicht. Wenn Ihre Eingabe eine Zeichenfolge ist, müssen Sie sie natürlich in eine numbererste konvertieren, z. B. via parseFloat().
le_m

47

Oder Sie können dies einfach verwenden, um herauszufinden, ob es sich NICHT um eine Dezimalstelle handelt:

string.indexOf(".") == -1;

2
Ich denke, dies ist die eigentliche Lösung, da dies sogar für XX.0 funktioniert
Deepankar Sarkar

5
vor dem yournumber.toString.indexOf(".")
Fortfahren

1
francisco_ssb .. das Punktsymbol ist universell ... stellt die Dezimalstelle in der mathematischen Sprache dar .. dies ist universell und sollte in jedem Land funktionieren. Wenn Sie über Kommas (",") sprechen, müssen Sie natürlich vor dem indexOf (".") In Punkt (".") Konvertieren.
Daniel Omine

1
Ich denke, als er meinte, dass es in einigen Ländern nicht funktioniert, bezieht er sich auf die Währung, da der Euro ein Komma anstelle eines Dezimalpunkts verwendet. Die Frage ist jedoch nicht spezifisch für die Währung, sondern nur für Dezimalstellen ... wie in einem Bruchteil einer Zahl.
Tessa

1
Dies funktioniert nicht, wenn die Dezimalzahl 1,00 ist und Sie möchten, dass es ein int ist, es sei denn, Sie erzwingen einen Wert
simon-pr

21

Die gebräuchlichste Lösung besteht darin, den ganzzahligen Teil der Zahl zu entfernen und ihn wie folgt mit Null zu vergleichen:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

31
Warum nicht einfach startVal != Math.floor(startVal)?
Andy E

2
Nett. Gleiches Konzept, aber Ihre Version ist noch sauberer.
Thomas

1
@Andy E: Dies ist nur für positive Zahlen möglich. Es wird nicht für negative Zahlen funktionieren ..
Seeya K

3
@SeeyaK: Natürlich funktioniert es für negative Zahlen. Bitte probieren Sie es einfach aus.
Andy E

1
@DeepakGoyal - Das ist beabsichtigt. Die Math.FloorFunktion nimmt einen Dezimalwert an und der größte in JavaScript zulässige Dezimalwert ist 2^53 - 1oder 9007199254740991. Da 893144042145698745.3größer als dieses Maximum ist, schlägt die Funktion fehl.
Thomas

20

Einfach aber effektiv!

Math.floor(number) === number;

4
@OmShankar effizient = effektiv!
Geigen

Math.floor(3.0) == 3.0ist wahr, Math.floor(3.3) == 3.3ist falsch
Rohmer

@Fiddles, oh richtig, das wollte ich sagen: Nicht effizient, da dies im Vergleich zur% mod-Methode viel langsamer ist. Vielen Dank für die Korrektur
Om Shankar

19

// Wie wäre es damit, es zu byten?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

Ich fühle mich immer schlecht für Bitoperatoren in Javascript-

Sie bekommen kaum Bewegung.


14
Dies schlägt bei Ganzzahlen größer als 2 ^ 31 - 1 fehl, da >>der Wert in eine vorzeichenbehaftete 32-Bit-Ganzzahl konvertiert wird .
Matthew Crumley

1
@kennebec genial - das ist bei weitem die amüsanteste Lösung. Und es ist verdammt viel besser als ein RegEx.
Daniel B. Chapman

5
number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

Ziemlich cool und funktioniert auch für Dinge wie XX.0! Es funktioniert, weil Math.floor () jede Dezimalstelle abschneidet, wenn es eine hat. Wenn sich also der Boden von der ursprünglichen Zahl unterscheidet, wissen wir, dass es sich um eine Dezimalzahl handelt! Und keine String-Konvertierungen :)


4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

4
Schlägt für num= 999999999999999999999.
Bobince

1
konvertiere zuerst in einen String und mache dann das Re.
Ghostdog74

Arbeitete für mich ohne Konvertierung in String.
Abe Petrillo

4

Number.isInteger()ist wahrscheinlich die prägnanteste. Es gibt true zurück, wenn es sich um eine Ganzzahl handelt, und false, wenn dies nicht der Fall ist.


1
Dies sollte die akzeptierte Antwort sein, da es aufgrund der String-Probleme besser ist, als den Modul zu verwenden.
Ini

3
function isDecimal(n){
    if(n == "")
        return false;

    var strCheck = "0123456789";
    var i;

    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

Benötigt keine Erklärung. Es ist ziemlich einfach.
Grant Birchmeier

1
Wenn die Zeichenfolge einen der Werte in strCheck enthält, ist es eine Dezimalzahl ... (er verpasst dies. Und obwohl ...
NicoJuicy

2
parseInt(num) === num

Wenn eine Nummer übergeben wird, wird parseInt()die Nummer einfach als int zurückgegeben:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

4
Ich mag dieses sehr, aber es hängt von den spezifischen Bedürfnissen ab. Leider brauche ich eine Funktion, um den Test nicht zu bestehenparseInt(3.0) === 3.0 // true
zipzit

2

Konvertieren Sie die Zeichenfolge in ein Array, geteilt durch den Dezimalpunkt. Wenn das Array nur einen Wert hat, bedeutet dies, dass die Zeichenfolge keine Dezimalstelle enthält.

if(!number.split(".")[1]){
    //do stuff
}

Auf diese Weise können Sie auch die Ganzzahl und die Dezimalzahl ermitteln. Ein fortgeschritteneres Beispiel wäre.

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

1

Hier ist ein Auszug aus meiner Wachbibliothek (inspiriert von Effective JavaScript von David Herman):

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

1

Sie können es mit 10 multiplizieren und dann eine " Modulo " -Operation / Division mit 10 durchführen und prüfen, ob das Ergebnis dieser beiden Operationen Null ist. Das Ergebnis dieser beiden Operationen gibt Ihnen die erste Ziffer nach dem Dezimalpunkt. Wenn das Ergebnis gleich Null ist, ist die Zahl eine ganze Zahl.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}


1

Sie können die bitweisen Operationen verwenden, die den Wert ( ^ 0oder ~~) nicht ändern , um den Dezimalteil zu verwerfen, der zum Runden verwendet werden kann. Nach dem Runden der Zahl wird sie mit dem ursprünglichen Wert verglichen:

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true


1

Mit der folgenden Funktion können Sie überprüfen, ob eine Zahl Dezimalstellen hat:

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

Anscheinend wollen einige Benutzer Erklärungen. Ich werde es in Stücke zerbrechen: (num% 1)

Klammern bedeuten, dass diese Operationen zuerst ausgeführt werden. num - eine von der Funktion übergebene Variable. % - ein Modul-Symbol, das versucht, die linke Zahl durch die rechte zu teilen. Wenn es einen Rest gibt, wird dieser als Dezimalzahl zurückgegeben. Wenn es sich gleichmäßig teilt, gibt es 0 zurück.

Fassen Sie also zusammen, was wir bisher haben. (Num% 1) wird zurückkehren:

0 bei gleichmäßiger Aufteilung ODER #. ##### wenn nicht

0 == false.

[ANY_NUMBER_NOT_ZERO] == true.

Beispiele: new Boolean (0) ist false new boolean (12312.1231) ist true

Andere Alternativen: Ein Benutzer hätte versuchen können, den Wert von (num% 1) zurückzugeben, wodurch im Grunde dasselbe erreicht würde. Da return (0) falsch ist und return (1.213113) wahr ist.

Aber ich wollte einen booleschen Wert zurückgeben. Als Verknüpfung zum Erzwingen eines Werts in einen Booleschen Wert habe ich ein! Symbol davor.

So viele wie wissen.! bedeutet NICHT. Es erzwingt aber auch einen Wert in einen Booleschen Wert.

Seit der ! symobol erzwingt den Wert in einen Booleschen Wert und kehrt seinen Wert um. Ich benutze !! um den Wert in einen Booleschen Wert zu zwingen und seinen Wert wieder in seinen ursprünglichen Booleschen Wert umzukehren.

Geben Sie hier die Bildbeschreibung ein


Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Nic3500

0

Funktion für Schecknummer ist Dezimalzahl oder ganze Zahl

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}

0

Vielleicht funktioniert das bei Ihnen?

Es verwendet Regex, um zu überprüfen, ob die Zahl ein Komma enthält. Wenn dies nicht der Fall ist, werden Komma und Streifen hinzugefügt.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

Willkommen bei StackOverflow. Könnten Sie näher erläutern, was dieser Code bewirkt und warum er Ihrer Meinung nach das Problem lösen wird?
Quinz

@quinz Es verwendet Regex, um zu überprüfen, ob die Zahl ein Komma enthält. Wenn dies nicht der Fall ist, werden Komma und Streifen hinzugefügt. Es macht also das, was die Frage verlangt, mit der zusätzlichen Funktionalität, die Formatierung für gerundete Preisschilder hinzuzufügen.
user11608734

0

Verwenden Sie Folgendes, wenn der Wert Zeichenfolge ist (z. B. von <input):

Math.floor(value).toString() !== value

Ich füge .toString()dem Boden hinzu, damit es auch in Fällen funktioniert, in denen value == "1."(mit einem Dezimaltrennzeichen oder einer anderen Zeichenfolge endet). Gibt auch Math.floorimmer einen Wert zurück, .toString()schlägt also nie fehl.

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.