Controlla se un numero ha un decimale / è un numero intero


284

Sto cercando un modo semplice in JavaScript per verificare se un numero ha una posizione decimale (al fine di determinare se è un numero intero). Per esempio,

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

Risposte:


822

L'uso del modulo funzionerà:

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

Si noti che questo si basa sul valore numerico del numero, indipendentemente dal formato. Tratta le stringhe numeriche contenenti numeri interi con un punto decimale fisso uguale agli interi:

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

10
Non ho espresso il mio voto negativo, ma direi che ha a che fare con 20.0, ha ancora un punto decimale e soddisfa quanto sopra. +1 da me comunque per avermi insegnato qualcosa di nuovo :)
Abe Petrillo

7
@Abe: abbastanza vero, anche se penso sia improbabile. È impossibile dire se 20.0ha un punto decimale a livello di codice, a meno che non sia espresso come una stringa. Inoltre, nessuna delle altre soluzioni ha ottenuto un voto negativo per non averlo affrontato ;-)
Andy E

1
@SREEP: vedere i commenti sopra. 0,00 non è 0,00 in JavaScript se rappresentato come valore numerico. Può essere rappresentato come una stringa ("0.00"), nel qual caso la domanda è "controlla se una stringa è un numero intero" anziché "controlla se un numero è un numero intero" .
Andy E,

3
@Swanidhi: cosa intendi? Cosa non sarà valido? "10."è un numero intero e il risultato sarà esattamente lo stesso di "10"o 10.
Andy E

3
L'OP chiede di verificare se un NUMERO è un numero intero. Da nessuna parte menziona le stringhe - a questo proposito, la risposta di Andy è giusta.
Om Shankar,

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

Number.isInteger () fa parte dello standard ES6 e non è supportato in IE11.

Restituisce false per NaN, Infinitye non numerici argomenti, mentre x % 1 != 0restituisce true.


2
soluzione fallita per 12.0
Vikas Arora,

@VikasArora No, funziona come previsto. Number.isInteger(12.0)ritorna true.
le_m

Questo sembra che dovrebbe essere la risposta giusta, ma purtroppo, non funziona per la notazione scientifica, ad esempio, Number.isInteger('1e3')è false, anche se Number.isInteger(1e3)è vero. Supponendo l'intento della questione è trovare valori non interi (piuttosto che l'effettiva presenza di un punto decimale nella rappresentazione), allora il valore di stringa '12 .0' dovrebbe passare quanto rappresenta un numero intero, ma di nuovo, Number.isInteger('12.0')è false.
brianmearns,

La domanda di @brianmearns OP è se a numberè intero o no. Se il tuo input è una stringa, devi convertirlo in una numberprima, ad esempio tramite parseFloat(), ovviamente.
le_m

47

Oppure potresti semplicemente usarlo per scoprire se NON è un decimale:

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

2
Penso che questa sia la vera soluzione in quanto funziona anche per XX.0
Deepankar Sarkar,

5
converti in stringa prima di procedere .. ovvero: yournumber.toString.indexOf(".")
Daniel Omine,

1
francisco_ssb .. il simbolo del punto è universale ... rappresenta la posizione decimale nella lingua matematica .. questa è universale e dovrebbe funzionare in qualsiasi paese. Se stai parlando di virgole (","), devi convertirlo in punto (".") Prima dell'indiceOf ("."), Ovviamente ..
Daniel Omine,

1
Penso che quando intendeva dire che non funziona in alcuni paesi, si riferisce alla valuta, poiché l'euro utilizza una virgola anziché un punto decimale. Tuttavia, la domanda non è specifica della valuta, ma solo dei decimali ... come in una frazione di un numero.
Tessa,

1
Questo non funziona se il decimale è 1.00 e si desidera che sia un int a meno che non si forzino valori
simon-pr

21

La soluzione più comune è rimuovere la parte intera del numero e confrontarla con zero in questo modo:

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

31
Perché non solo startVal != Math.floor(startVal)?
Andy E

2
Bello. Stesso concetto, ma la tua versione è ancora più pulita.
Thomas,

1
@Andy E: questo è possibile solo per numeri positivi. Non funzionerà con numeri negativi ..
Seeya K

3
@SeeyaK: ovviamente funzionerà con numeri negativi. Non esitate a provarlo.
Andy E

1
@DeepakGoyal - Questo è design. La Math.Floorfunzione accetta un valore decimale e il valore decimale più grande consentito in JavaScript è 2^53 - 1o 9007199254740991. Poiché 893144042145698745.3è maggiore di questo massimo, la funzione fallirà.
Thomas,

20

Semplice ma efficace!

Math.floor(number) === number;

4
@OmShankar efficient! = Efficace
Fiddles

Math.floor(3.0) == 3.0è vero, Math.floor(3.3) == 3.3è falso
Rohmer,

@Fiddles, oh giusto, questo è quello che volevo dire: non efficiente in quanto è molto più lento nelle prestazioni rispetto al metodo% mod. Grazie per la correzione
Om Shankar,

19

// Che ne dici di byte-ing?

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

Mi sento sempre un po 'male per gli operatori bit in javascript-

difficilmente si esercitano.


14
Ciò non riesce per numeri interi superiori a 2 ^ 31 - 1, perché >>converte il valore in un numero intero a 32 bit con segno .
Matthew Crumley,

1
@kennebec eccezionale - questa è di gran lunga la soluzione più divertente. Ed è molto meglio di un RegEx.
Daniel B. Chapman,

5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Abbastanza bello e funziona anche per cose come XX.0! Funziona perché Math.floor () taglia qualsiasi decimale se ne ha uno, quindi se il piano è diverso dal numero originale sappiamo che è un decimale! E nessuna conversione di stringhe :)



4

Number.isInteger()è probabilmente il più conciso. Restituisce vero se è un numero intero e falso se non lo è.


1
Questa dovrebbe essere la risposta accettata, perché è meglio quindi utilizzare il modulo a causa dei problemi di stringa.
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;
}

Non ha bisogno di una spiegazione. È abbastanza semplice
Grant Birchmeier,

1
Se la stringa contiene uno dei valori in strCheck, è un decimale ... (si sta perdendo. E, comunque ...
NicoJuicy,

2
parseInt(num) === num

quando viene passato un numero, parseInt()restituisce semplicemente il numero come int:

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

4
Mi piace molto, ma dipende dalle esigenze specifiche di una persona. Sfortunatamente, ho bisogno di una funzione per parseInt(3.0) === 3.0 // true
fallire

2

converte la stringa numerica in array, divisa per punto decimale. Quindi, se l'array ha un solo valore, ciò significa che nessun decimale nella stringa.

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

In questo modo puoi anche sapere quali sono effettivamente il numero intero e il decimale. un esempio più avanzato sarebbe.

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

if(!dece){
    //do stuff
}

1

Ecco un estratto dalla mia biblioteca di guardie (ispirato a Effective JavaScript di 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

Puoi moltiplicarlo per 10 e quindi eseguire un'operazione " modulo " / divison con 10 e verificare se il risultato di queste due operazioni è zero. Il risultato di queste due operazioni ti darà la prima cifra dopo il punto decimale. Se il risultato è uguale a zero, il numero è un numero intero.

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


1

È possibile utilizzare le operazioni bit a bit che non modificano il valore ( ^ 0o ~~) per scartare la parte decimale, che può essere utilizzata per l'arrotondamento. Dopo aver arrotondato il numero, viene confrontato con il valore originale:

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

È possibile utilizzare la seguente funzione per verificare se un numero ha posizioni decimali:

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

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

Quindi apparentemente alcuni utenti vogliono spiegazioni. Lo spezzerò in pezzi: (num% 1)

Le parentesi significano eseguire prima quelle operazioni. num: una variabile passata dalla funzione. %: un simbolo del modulo che tenta di dividere il numero sinistro per il diritto. Se c'è un resto, lo restituisce come un decimale. Se si divide uniformemente, restituisce 0.

Quindi, riassumi ciò che abbiamo finora. (Num% 1) restituirà:

0 se diviso equamente O #. ##### in caso contrario

0 == falso.

[ANY_NUMBER_NOT_ZERO] == vero.

Esempi: il nuovo booleano (0) è falso il nuovo booleano (12312.1231) è vero

Altre alternative: un utente avrebbe potuto tentare di restituire il valore di (num% 1), che avrebbe sostanzialmente ottenuto la stessa cosa. Poiché return (0) è falso e return (1.213113) è vero.

Ma volevo restituire un valore booleano. Quindi come scorciatoia per forzare un valore in un valore booleano ho aggiunto un! simbolo prima di esso.

Quanti ne potrebbero sapere.,! significa NO. Ma forza anche un valore in un valore booleano.

Dal momento che! Symobol forza il valore in un valore booleano e ne inverte il valore. Io uso !! per forzare il valore in un valore booleano e invertire il suo valore al valore booleano originale.

inserisci qui la descrizione dell'immagine


Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Nic3500,

0

La funzione per il numero di controllo è il numero decimale o intero

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

0

Forse questo funziona per te?

Usa regex per verificare se c'è una virgola nel numero e, in caso contrario, aggiungerà la virgola e la striscia.

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

Benvenuto in StackOverflow. Potresti elaborare cosa fa questo codice e perché pensi che risolverà il problema.
Quinz,

@quinz Usa regex per verificare se c'è una virgola nel numero e se non lo è, aggiungerà la virgola e la striscia. Quindi fa quello che la domanda chiede con l'aggiunta della funzionalità di aggiunta della formattazione per i prezzi arrotondati.
user11608734

0

Utilizzare quanto segue se il valore è stringa (ad es. Da <input):

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

Aggiungo .toString()al piano per farlo funzionare anche nei casi in cui value == "1."(termina con un separatore decimale o un'altra stringa). Inoltre Math.floorrestituisce sempre un valore quindi .toString()non fallisce mai.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.