Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy ta liczba jest całkowita?
Forum PHP.pl > Forum > PHP
sheerun
Mam taki skrypt:
  1. <?php
  2. $y=12*(8/6);
  3. echo "Y = " . $y . "<br />";
  4. if(is_int($y)) echo "Jest całkowita<br />"; 
  5.  else echo "Nie jest całkowita\n";
  6. ?>


Ten skrypt wyświetli coś takiego:
Y = 16
Nie jest całkowita

Mimo, że 16 jest całkowita. To równanie psuje oczywiście 8/6.
Zależy mi na sprawdzeniu (w miarę szybki sposób myślę) że y jest całkowitą liczbą.
Dodam, że y może być czasami równe nawet np. 1.00001.
Jednak przyjmę każdy dobry sposób happy.gif
szczypior
is_int() sprawdza czy zmienna została przesłana jako INTEGER a nie czy jej wartość jest całkowita
sheerun
Pouczające, ale jak sprawdzić czy jej wartość to liczba całkowita
Prym
jesli sie nie myle to intval() zwraca liczbe całkowitą

wiec na dobra sprawe można sprawdzic czy nie ma zadnych ulamkow w lopatologiczny sposob smile.gif :

$x=$y-intval($y); // dostajemy 0,........ to co w ulamku

a potem tylko zifowac czy ulamek($x) jest > 0
domis86
Cytat(Prym @ 26.11.2007, 19:38:59 ) *
jesli sie nie myle to intval() zwraca liczbe całkowitą

wiec na dobra sprawe można sprawdzic czy nie ma zadnych ulamkow w lopatologiczny sposob smile.gif :

$x=$y-intval($y); // dostajemy 0,........ to co w ulamku

a potem tylko zifowac czy ulamek($x) jest > 0


AGP

bo nieraz jak robi sie jakies dzielenie to chociaz wynik powinien byc calkowity to wyjdzie float z jakims kawalkiem. Wynika to z niedokladnosci floata.

np: 2/4 = 2.0000000000000000001 (czesto tak jest, moze akurat nie na tych liczbach tu podanych)


rozwiazaniem moze byc zaokroglenie do np 5 miejsca po przecinku :
$x=$y-intval( round($y,5) );
sheerun
Dzięki za chęci, ale wasze sposoby niestety nie działają

Załatwiłem to tak:

function myIsInt ($x){return !(preg_match('/\./', (string)$x));}

Pozdrawiam
domis86
jak nie dzialaja jak dzialaja
widze, ze lubisz chodzic na okolo - regexpy - powodzenia
nevt
sh33run koledzy mają rację - twoje rozwiązanie jest takie sobie:
  1. <?php
  2. if(myIsInt('') and myIsInt('kupa') and myIsInt('3,5') and myIsInt('2e-1'))
  3. echo 'SAME LICZBY CAŁKOWITE?';
  4. if(!(myIsInt('1.0') or myIsInt('2.0') or myIsInt('3.0') or myIsInt('2.2e2)))
  5.  echo 'ANI JEDNEJ LICZBY CAŁKOWITEJ?;
  6. ?>

prawidłowa funkcja, odporna na wszystkie typy wejsciowe powinna wyglądać mn. więcej tak:
  1. <?php
  2. function is_real_int($x)
  3. {
  4. return (is_numeric($x) and (intval($x) == floatval($x)));
  5. }
  6. ?>

powodzenia
domis86
nevt: obadaj se liczbe 4200000000 na twojej funkcji aaevil.gif
nevt
oczywiscie że FALSE: 4200000000 nie jest liczbą całkowitą w PHP bo przekracza zakres typu int - zatem twoje rozwiązanie jest idealne dlatego że działa dla tej wartości? nie podoba ci się kiedy ludzie dobrze doradzają - to daj sobie spokój z tym forum. nikt tu nic do ciebie nie ma, a wskazanie słabych stron twojego rozwiązania nie jest atakiem na twoją osobę.
domis86
Ale kolega sie pytal chyba o to
"jak sprawdzic czy liczba jest calkowita"
a nie
"jak sprawdzic czy liczba to int"
nevt
zgadza się - moja funkcja działa poprawnie tylko dla liczb w zakresie typu int - ale nie zmienia to faktu że rozwiązanie kolegi nie dziala w znacznie wiekszym zakresie przekazywanych warości. nawet jeśli spełnia jego oczekiwania w jakimś konkretnym zastosowaniu, to powinna się nazywać nie myIsInt() ale myNotDot().
Cytat
Zależy mi na sprawdzeniu (w miarę szybki sposób myślę) że y jest całkowitą liczbą.
Dodam, że y może być czasami równe nawet np. 1.00001.
Jednak przyjmę każdy dobry sposób
liczby pokazane w pytaniu kolegi nie sa na granicy zakresu int - a kolega twierdzi, że chętnie przyjmie każde dobre rozwiązanie - uważam, że moja funkcja spełnia jego kryteria i potrzeby, jest prosta i czytelna - przeciez forum ma rowniez charakter edukacyjny...
domis86
no to ja powiem tak smile.gif

  1. <?php
  2. function czyJestCalkowita($x)
  3. {
  4. return (is_numeric($x) and (floatval($x) == floor(floatval($x))));
  5. }
  6. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.