Sprawdź, czy liczba ma miejsce dziesiętne / jest liczbą całkowitą

284

Szukam łatwego sposobu w JavaScript, aby sprawdzić, czy liczba ma miejsce dziesiętne (w celu ustalenia, czy jest liczbą całkowitą). Na przykład,

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}
Hans
źródło

Odpowiedzi:

820

Korzystanie z modułu będzie działać:

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

Pamiętaj, że jest to oparte na wartości liczbowej liczby, niezależnie od formatu. Traktuje ciągi liczbowe zawierające liczby całkowite ze stałym punktem dziesiętnym takim samym jak liczby całkowite:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5
Andy E.
źródło
10
Nie oddałem głosu, ale powiedziałbym, że ma to coś wspólnego z 20,0, wciąż ma przecinek dziesiętny i spełnia powyższe wymagania. W każdym razie +1 ode mnie za nauczenie mnie czegoś nowego :)
Abe Petrillo
7
@Abe: dość prawda, choć myślę, że to mało prawdopodobne. Nie można powiedzieć 20.0programowo, czy ma kropkę dziesiętną programowo, chyba że jest wyrażona jako ciąg znaków. Poza tym żadne z pozostałych rozwiązań nie uzyskało negatywnego wyniku za nie zajęcie się tym ;-)
Andy E
1
@SREEP: patrz komentarze powyżej. 0,00 nie jest 0,00 w JavaScript, gdy jest reprezentowane jako wartość liczbowa. Może być reprezentowany jako ciąg („0,00”), w takim przypadku pytaniem jest „sprawdź, czy ciąg jest liczbą całkowitą” zamiast „sprawdź, czy liczba jest liczbą całkowitą” .
Andy E
3
@Swanidhi: co masz na myśli? Co nie będzie ważne? "10."jest liczbą całkowitą, a wynik będzie dokładnie taki sam jak "10"lub10 .
Andy E,
3
PO prosi o sprawdzenie, czy NUMER jest liczbą całkowitą. Nigdzie nie wspomina o sznurkach - pod tym względem odpowiedź Andy'ego jest słuszna.
Om Shankar
58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () jest częścią standardu ES6 i nie jest obsługiwany w IE11.

Zwraca false NaN, Infinitya non-numeryczne argumenty natomiast x % 1 != 0zwraca true.

le_m
źródło
2
rozwiązanie nie działa dla 12.0
Vikas Arora
@VikasArora Nie, działa zgodnie z przeznaczeniem. Number.isInteger(12.0)zwraca true.
le_m
Wydaje się, że powinna to być właściwa odpowiedź, ale niestety nie działa w przypadku notacji naukowej, np. Number.isInteger('1e3')Jest false, chociaż Number.isInteger(1e3)jest prawdą. Zakładając, że celem pytania jest znalezienie wartości niecałkowitych (zamiast rzeczywistej obecności kropki dziesiętnej w reprezentacji), wówczas wartość ciągu „12 .0” powinna przejść, ponieważ reprezentuje liczbę całkowitą, ale znowu Number.isInteger('12.0')jest false.
brianmearns,
@brianmearns OP ma pytanie, czy a numberjest całe, czy nie. Jeśli twoje dane wejściowe są ciągiem znaków, musisz je przekonwertować na numberpierwszy, np. Przez parseFloat()oczywiście.
le_m
47

Możesz też użyć tego, aby dowiedzieć się, czy NIE jest to ułamek dziesiętny:

string.indexOf(".") == -1;
Ike
źródło
2
Myślę, że to jest właściwe rozwiązanie, ponieważ działa nawet dla XX.0
Deepankar Sarkar
5
yournumber.toString.indexOf(".")
zamień
1
francisco_ssb .. symbol punktu jest uniwersalny ... reprezentuje miejsce po przecinku w języku matematyki .. jest uniwersalny i powinien działać w każdym kraju. Jeśli mówisz o przecinkach („,”), musisz przekonwertować na punkt („.”) Przed indeksem („.”), Oczywiście…
Daniel Omine,
1
Myślę, że kiedy miał na myśli, że nie działa w niektórych krajach, odnosi się do waluty, ponieważ euro używa przecinka zamiast przecinka dziesiętnego. Jednak pytanie nie jest specyficzne dla waluty, tylko ułamki dziesiętne ... jak ułamek liczby.
Tessa
1
To nie działa, jeśli liczba dziesiętna wynosi 1,00 i chcesz, aby była liczbą całkowitą, chyba że wymusisz wartość
simon-pr
21

Najczęstszym rozwiązaniem jest usunięcie części liczby całkowitej z liczby i porównanie jej do zera w następujący sposób:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}
Tomasz
źródło
31
Dlaczego nie tylko startVal != Math.floor(startVal)?
Andy E
2
Miły. Ta sama koncepcja, ale twoja wersja jest jeszcze czystsza.
Thomas
1
@Andy E: Jest to możliwe tylko dla liczb dodatnich. To nie zadziała dla liczb ujemnych ..
Seeya K,
3
@SeeyaK: oczywiście będzie działać na liczby ujemne. Spróbuj tego.
Andy E
1
@DeepakGoyal - To jest z założenia. Math.FloorFunkcja przyjmuje wartość dziesiętną i największa wartość dziesiętną jest dozwolony w JavaScript 2^53 - 1lub 9007199254740991. Ponieważ 893144042145698745.3jest większy niż to maksimum, funkcja zawiedzie.
Thomas
20

Proste ale efektywne!

Math.floor(number) === number;
dYale
źródło
4
@OmShankar skuteczny! = Skuteczny
Fiddles
Math.floor(3.0) == 3.0jest prawdą, Math.floor(3.3) == 3.3jest fałszem
Rohmer
@Fiddles, oh prawo, to co chciałem powiedzieć: Nie wydajny jak to jest znacznie wolniejsze w działaniu w porównaniu do metody% mod. Dzięki za poprawienie
Om Shankar,
19

// Co powiesz na bajtowanie?

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

Zawsze źle się czuję dla operatorów bitów w javascript-

prawie nie ćwiczą.

Kennebec
źródło
14
Nie udaje się to w przypadku liczb całkowitych większych niż 2 ^ 31 - 1, ponieważ >>konwertuje wartość na 32-bitową liczbę całkowitą ze znakiem .
Matthew Crumley
1
@kennebec awesome - to zdecydowanie najbardziej zabawne rozwiązanie. I to jest o wiele lepszy niż RegEx.
Daniel B. Chapman
5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Całkiem fajne i działa również na takie rzeczy jak XX.0! Działa, ponieważ Math.floor () odcina każdy ułamek dziesiętny, jeśli go ma, więc jeśli podłoga różni się od pierwotnej liczby, wiemy, że jest to ułamek dziesiętny! I brak konwersji ciągów :)


źródło
4
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);
ghostdog74
źródło
4
Nie działa na num= 999999999999999999999.
bobince
1
najpierw przekonwertuj na ciąg, a następnie wykonaj ponownie.
ghostdog74
Pracował dla mnie bez konwersji na ciąg.
Abe Petrillo,
4

Number.isInteger()jest prawdopodobnie najbardziej zwięzły. Zwraca true, jeśli jest liczbą całkowitą, a false, jeśli nie jest.

Christopher Connery
źródło
1
To powinna być zaakceptowana odpowiedź, ponieważ jest lepsza niż użycie modułu z powodu problemów z łańcuchem.
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;
}
Vitor Lins
źródło
Nie potrzebuje wyjaśnienia. To całkiem proste.
Grant Birchmeier,
1
Jeśli ciąg zawiera dowolną wartość w strCheck, to jest ułamek dziesiętny ... (brakuje go. I chociaż ...
NicoJuicy
2
parseInt(num) === num

gdy przekazany numer, parseInt()po prostu zwraca liczbę jako int:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true
Michael
źródło
4
Bardzo mi się podoba, ale zależy to od konkretnych potrzeb. Niestety potrzebuję funkcji, która parseInt(3.0) === 3.0 // true
NIE POWIODŁA
2

konwertuj ciąg liczbowy na tablicę, dzielony przez przecinek dziesiętny. Następnie, jeśli tablica ma tylko jedną wartość, oznacza to brak dziesiętnego ciągu.

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

W ten sposób możesz także wiedzieć, jaka jest liczba całkowita i dziesiętna. bardziej zaawansowanym przykładem byłby.

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

if(!dece){
    //do stuff
}
Kareem
źródło
1

Oto fragment mojej biblioteki strażników (zainspirowanej przez Effective JavaScript Davida Hermana):

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
schirrmacher
źródło
1

Możesz pomnożyć go przez 10, a następnie wykonać operację / podział „ moduloz 10 i sprawdzić, czy wynik tych dwóch operacji wynosi zero. Wynik tych dwóch operacji da ci pierwszą cyfrę po przecinku. Jeśli wynik jest równy zero, to liczba jest liczbą całkowitą.

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}
BSevo
źródło
1
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}
Steve Brush
źródło
1

Możesz użyć operacji bitowych, które nie zmieniają wartości ( ^ 0lub ~~), aby odrzucić część dziesiętną, której można użyć do zaokrąglenia. Po zaokrągleniu liczba jest porównywana z pierwotną wartością:

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

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true
makovkastar
źródło
1
function isWholeNumber(num) {
  return num === Math.round(num);
}
Dmitrij Szaszurow
źródło
1

Możesz użyć następującej funkcji, aby sprawdzić, czy liczba ma miejsca dziesiętne:

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

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

Najwyraźniej niektórzy użytkownicy chcą wyjaśnień. Rozbiorę to na kawałki: (num% 1)

Nawiasy oznaczają, że najpierw wykonaj te operacje. num - zmienna przekazana przez funkcję. % - symbol modułu, który próbuje podzielić lewą liczbę przez prawą. Jeśli jest reszta, zwraca ją jako liczbę dziesiętną. Jeśli dzieli się równomiernie, zwraca 0.

Podsumowując to, co do tej pory mamy., (Num% 1) zwróci:

0 równomiernie podzielone LUB #. ##### jeśli nie

0 == fałsz.

[ANY_NUMBER_NOT_ZERO] == prawda.

Przykłady: nowy Boolean (0) jest fałszem nowy Boolean (12312.1231) jest prawdziwy

Inne alternatywy: użytkownik mógł spróbować zwrócić wartość (num% 1)., Co w zasadzie pozwoliłoby osiągnąć to samo. Ponieważ return (0) jest false, a return (1.213113) jest true.

Ale chciałem zwrócić wartość logiczną. Więc jako skrót do wymuszenia wartości logicznej dodałem! symbol przed nim.

Tyle, ile może wiedzieć.,! oznacza NIE. Ale wymusza także wartość logiczną.

Od czasu! symobol wymusza wartość logiczną i odwraca jej wartość. Używam !! aby wymusić wartość na wartość logiczną i odwrócić jej wartość z powrotem do pierwotnej wartości logicznej.

wprowadź opis zdjęcia tutaj

twalow
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Nic3500,
0

Funkcja numeru kontrolnego to liczba dziesiętna lub całkowita

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}
użytkownik3897934
źródło
0

Może to ci odpowiada?

Używa wyrażenia regularnego, aby sprawdzić, czy w numerze jest przecinek, a jeśli go nie ma, doda przecinek i pasek.

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);
użytkownik 11608734
źródło
Witamy w StackOverflow. Czy możesz wyjaśnić, co robi ten kod i dlaczego uważasz, że rozwiąże problem.
quinz
@quinz Używa wyrażenia regularnego, aby sprawdzić, czy w numerze jest przecinek, a jeśli go nie ma, doda przecinek i pasek. Robi to, o co pyta pytanie, z dodatkową funkcjonalnością dodawania formatowania zaokrąglonych metek cenowych.
user11608734
0

Użyj następującego, jeśli wartość jest łańcuchem (np. Z <input):

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

Dodam .toString()do podłogi, aby działała również w przypadkach, gdy value == "1."(kończy się separatorem dziesiętnym lub innym ciągiem). Również Math.floorzawsze zwraca pewną wartość, więc .toString()nigdy nie zawodzi.

michal.jakubeczy
źródło