Jak okaże się, że liczba ta jest float
albo integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
źródło
źródło
<nit-pick>
JavaScript nie ma różnych liczb całkowitych i liczb zmiennoprzecinkowych. Każda liczba w JavaScript jest tylkoNumber
.</nit-pick>
Infinity
według ciebie jest liczbą całkowitą czy niecałkowitą? Odpowiedzi tutaj są dość równomiernie rozłożone na ten wynik.Infinity
nie można jej uważać za liczbę całkowitą.Odpowiedzi:
zaznacz resztę, dzieląc przez 1:
Jeśli nie wiesz, że argument jest liczbą, potrzebujesz dwóch testów:
Aktualizacja 2019 5 lat po napisaniu tej odpowiedzi rozwiązanie zostało ustandaryzowane w skrypcie ECMA 2015. Rozwiązanie to jest ujęte w tej odpowiedzi .
źródło
true
,false
,null
, pusta tablica, tablica zawierająca jeden numer integralną, tablicę zawierającą ciąg reprezentujący liczbę całkowitą, a może i więcej.""
a1.0
isInt("");
&&isInt(1.0);
skutkujetrue
obejrzeniem tego demo jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, czy to „po prostu źle” czy „Najgorsza odpowiedź na SO”, ponieważ nie sprawdza, czy argument jest najpierw tablicą? Tak, dobra praktyka sprawdzania argumentów, ale to odpowiedzialność programisty. SO odpowiedzi powinny być krótkie i bezpośrednio odpowiadać na pytanie tak jasno, jak to możliwe.Wypróbuj te funkcje, aby sprawdzić, czy wartość jest pierwotną wartością liczbową, która nie ma części ułamkowej i mieści się w granicach wielkości, które można przedstawić jako dokładną liczbę całkowitą.
źródło
n===+n
aby sprawdzić numerycznie,n|0
zaokrąglić), ale z wbudowanymi operatorami. funkyparseFloat()
najpierw.|
(OR) działają tylko na 32-bitowych liczbach całkowitych ze znakiem. OP nie określa, czy celem jest sprawdzenie podpisanych wartości int32. Więc to nie zadziała z liczbami spoza zakresu.isInteger(5000000000)
wróci,false
co jest złe!Dlaczego nie coś takiego:
źródło
n
jest konwertowana na ciąg znaków przezparseInt
. Zobacz MDN . Ale skorzystam z tego rozwiązania. :)Istnieje metoda o nazwie,
Number.isInteger()
która jest obecnie implementowana we wszystkim oprócz IE. MDN zapewnia również wypełnianie wielu innych przeglądarek:Jednak w przypadku większości przypadków użycia lepiej jest użyć tego,
Number.isSafeInteger
który również sprawdza, czy wartość jest tak wysoka / niska, że i tak zostaną utracone miejsca dziesiętne. MDN ma do tego również polyfil. (Potrzebujesz równieżisInteger
wypełnienia powyżej).źródło
12.0 ∈ ℤ
.Number.isInteger
. Jest to jednak poprawne wypełnienie dlaNumber.isSafeInteger
.Number.isInteger
nie powinien sprawdzać, czy liczba jest „bezpieczną liczbą całkowitą”. Zobacz w MDN: isInteger i isSafeInteger .Możesz użyć prostego wyrażenia regularnego:
Możesz też skorzystać z poniższych funkcji, w zależności od potrzeb. Są opracowywane przez projekt PHPJS .
is_int()
=> Sprawdź, czy typ zmiennej jest liczbą całkowitą i czy jej zawartość jest liczbą całkowitąis_float()
=> Sprawdź, czy typ zmiennej jest zmiennoprzecinkowy i czy jego zawartość jest zmiennoprzecinkowactype_digit()
=> Sprawdź, czy typ zmiennej jest łańcuchem i czy jego zawartość ma tylko cyfry dziesiętneAktualizacja 1
Teraz sprawdza również liczby ujemne, dziękuję za komentarz @ChrisBartley !
źródło
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Oto wydajne funkcje, które sprawdzają, czy wartość jest liczbą lub czy można ją bezpiecznie przekonwertować na liczbę:
A dla liczb całkowitych (zwróciłoby wartość false, jeśli wartość jest liczbą zmiennoprzecinkową):
Wydajność polega na tym, że parseInt (lub parseNumber) jest unikany, gdy wartość jest już liczbą. Obie funkcje parsowania zawsze konwertują najpierw na ciąg, a następnie próbują parsować ten ciąg, co byłoby marnotrawstwem, jeśli wartość jest już liczbą.
Dziękujemy innym postom tutaj za dostarczenie dalszych pomysłów na optymalizację!
źródło
źródło
1.2
. Zawsze testuj funkcje numeryczne za pomocą 0,1 0,2 0,3działa we wszystkich przypadkach.
źródło
isInt('1')
zwracatrue
zgodnie z oczekiwaniami (przynajmniej dla mnie). Dziwnie mało, chociaż, to powracatrue
doisInt([5])
jak również. Nie miało to dla mnie znaczenia, ale może dla ciebie, więc uważaj.Jak wspomnieli inni, masz tylko podwójne w JS. Jak więc zdefiniować liczbę będącą liczbą całkowitą? Po prostu sprawdź, czy zaokrąglona liczba jest sobie równa:
źródło
isFloat('abc')
zwracatrue
isFloat(NaN) // true
Co powiesz na ten?
źródło
console.log(isFloat(1.0));
wyniki fałszywe.Oto, czego używam do liczb całkowitych:
Krótko, miło :) Działa cały czas. Tak sugeruje David Flanagan, jeśli się nie mylę.
źródło
parseFloat
?To naprawdę zależy od tego, co chcesz osiągnąć. Jeśli chcesz „emulować” silnie napisane języki, sugeruję, abyś nie próbował. Jak wspomniano inni, wszystkie liczby mają tę samą reprezentację (ten sam typ).
Używanie czegoś takiego jak Claudiu zapewniło:
isInteger( 1.0 )
-> prawdaco wygląda dobrze dla zdrowego rozsądku, ale w czymś takim jak C byś dostał
false
źródło
Każda liczba zmiennoprzecinkowa z zerową częścią dziesiętną (np. 1,0, 12,00, 0,0) jest domyślnie rzutowana na liczbę całkowitą, więc nie można sprawdzić, czy są zmiennoprzecinkowe, czy nie.
źródło
źródło
!!(24.0%1)
jest fałszyweTo naprawdę nie musi być takie skomplikowane. Wartość liczbowa odpowiedników parseFloat () i parseInt () liczb całkowitych będzie taka sama. W ten sposób możesz zrobić tak:
Następnie
Umożliwi to również sprawdzanie ciągów, a zatem nie jest ścisłe. Jeśli chcesz rozwiązania typu silnego (aka, nie będzie działać z ciągami znaków):
źródło
Nie miałem przypadku, w którym to nie zadziałało.
źródło
2
jest liczbą całkowitą i23
jest uważany za drugi argument funkcji. W javascript dziesiętne są zapisywane za pomocą kropki jako separatora - tak powinno być2.23
.TO JEST OSTATECZNY KOD KONTROLI ZARÓWNO WEWNĘTRZNEJ I PŁYWAKOWEJ
LUB
źródło
źródło
To proste jak:
Wypróbuj to w konsoli:
To dezorientuje wielu ludzi. Ilekroć coś ma wartość .0, nie jest to już liczba zmiennoprzecinkowa. To jest liczba całkowita. Możesz też nazwać to „rzeczą liczbową”, ponieważ nie ma tak ścisłego rozróżnienia, jak wtedy w C. Dobre, stare czasy.
Zasadniczo wszystko, co możesz zrobić, to sprawdzić liczbę całkowitą, akceptując fakt, że 1.000 jest liczbą całkowitą.
Ciekawa uwaga dodatkowa
Był komentarz na temat wielkich liczb. Ogromne liczby oznaczają ŻADNY problem dla tego podejścia; ilekroć parseInt nie jest w stanie obsłużyć liczby (ponieważ jest zbyt duża), zwróci coś innego niż wartość rzeczywista, więc test zwróci FAŁSZ. Jest to dobra rzecz, ponieważ jeśli uważasz coś za „liczbę”, zwykle spodziewasz się, że JS będzie w stanie to obliczyć - więc tak, liczby są ograniczone i parsuje To weźmie to pod uwagę , mówiąc inaczej.
Spróbuj tego:
W mojej przeglądarce (IE8) zwraca to „a jest w porządku; b kończy się niepowodzeniem”, co jest właśnie spowodowane dużą liczbą w b. Limit może się różnić, ale wydaje mi się, że 20 cyfr „powinno wystarczyć każdemu”, żeby zacytować klasykę :)
źródło
Number.isInteger
.Number.isInteger
działa. Test jednowierszowy jestn === (n | 0)
pokazany w innej odpowiedzi.To rozwiązanie działało dla mnie.
źródło
W przypadku liczb całkowitych używam tego
źródło
W skrypcie Java wszystkie liczby są takie
internally 64 bit floating point
same, jak podwójne w Javie. W javascript nie ma różnych typów, wszystkie są reprezentowane według typunumber
. Dlatego nie będziesz w stanie wykonaćinstanceof
czeku. Możesz jednak użyć powyższych rozwiązań, aby dowiedzieć się, czy jest to liczba ułamkowa. projektanci skryptu Java uważali, że jednym typem mogą uniknąć licznych błędów rzutowania.źródło
Czasami obiekty Number nie pozwalają na bezpośrednie użycie operatora mod (%), jeśli masz do czynienia z tą sprawą, możesz użyć tego rozwiązania.
źródło
Próbując tutaj niektórych odpowiedzi, ostatecznie napisałem to rozwiązanie. Działa to również z liczbami w ciągu.
źródło
To może nie jest tak wydajne jak% answer, co uniemożliwia najpierw konwersję na ciąg, ale jeszcze nie widziałem, żeby ktoś go opublikował, więc oto inna opcja, która powinna działać dobrze:
źródło
Dla tych ciekawych, używając Benchmark.js przetestowałem najczęściej głosowane odpowiedzi (i jedną opublikowaną dzisiaj) na ten post, oto moje wyniki:
źródło
Oto mój kod. Sprawdza, czy nie jest to pusty ciąg (który w przeciwnym razie przejdzie), a następnie konwertuje go do formatu numerycznego. Teraz, w zależności od tego, czy chcesz, aby „1.1” było równe 1.1, może to być to, czego szukasz.
źródło
Podoba mi się ta mała funkcja, która zwróci prawdę zarówno dla liczb całkowitych dodatnich, jak i ujemnych:
Działa to, ponieważ 1 lub „1” zamienia się na „1.0”, czyli isNaN () zwraca false na (które następnie negujemy i zwracamy), ale 1.0 lub „1.0” staje się „1.0.0”, podczas gdy „string” staje się „string”. 0 ”, z których żadna nie jest liczbą, więc isNaN () zwraca false (i ponownie zostaje zanegowany).
Jeśli chcesz tylko dodatnich liczb całkowitych, jest ten wariant:
lub, dla ujemnych liczb całkowitych:
isPositiveInt () działa poprzez przesunięcie skonkatenowanego ciągu liczbowego przed testowaną wartość. Na przykład isPositiveInt (1) powoduje, że isNaN () ocenia „01”, co oznacza fałsz. Tymczasem, isPositiveInt (-1) powoduje, że isNaN () ocenia „0-1”, co ocenia true. Negujemy wartość zwrotu, a to daje nam to, czego chcemy. isNegativeInt () działa podobnie, ale bez zanegowania zwracanej wartości isNaN ().
Edytować:
Moja oryginalna implementacja zwróciłaby również wartość true dla tablic i pustych ciągów. Ta implementacja nie ma tej wady. Ma również tę zaletę, że zwraca wcześniej, jeśli val nie jest łańcuchem ani liczbą, lub jeśli jest pustym łańcuchem, co przyspiesza w takich przypadkach. Możesz dalej go modyfikować, zastępując dwie pierwsze klauzule
jeśli chcesz dopasować tylko liczby literalne (a nie ciągi znaków)
Edytować:
Nie mogę jeszcze dodawać komentarzy, więc dodaję to do mojej odpowiedzi. Benchmark opublikowany przez @Asok jest bardzo pouczający; jednak najszybsza funkcja nie spełnia wymagań, ponieważ zwraca PRAWDA również dla liczb zmiennoprzecinkowych, tablic, boolanów i pustych ciągów.
Utworzyłem następujący zestaw testów, aby przetestować każdą z funkcji, dodając również moją odpowiedź do listy (funkcja 8, która analizuje ciągi, i funkcja 9, która nie):
Przekartczyłem również test porównawczy z funkcją nr 8 dodaną do listy. Nie opublikuję wyniku, ponieważ są nieco zawstydzające (np. Ta funkcja NIE jest szybka) ...
Wyniki (skrócone - usunąłem udane testy, ponieważ dane wyjściowe są dość długie) są następujące:
Zostawiłem awarie, abyś mógł zobaczyć, gdzie zawodzi każda funkcja, oraz testy (ciąg) „#”, abyś mógł zobaczyć, jak każda funkcja obsługuje wartości całkowite i zmiennoprzecinkowe w ciągach, ponieważ niektóre mogą chcieć je parsować jako liczby, a niektóre może nie.
Spośród 10 przetestowanych funkcji te, które faktycznie spełniają wymagania OP, to [1,3,5,6,8,9]
źródło
Warunki swobodnej weryfikacji:
Warunki sprawdzania poprawności liczb całkowitych:
Mam nadzieję, że to może być pomocne.
źródło
Możesz dodać,
typeof a === 'number'
jeśli chcesz wykluczyć ciągi.źródło