ZALOGUJ SIĘ
login:
hasło:
przypomnij hasło
załóż konto użytkownika
(i zobacz kilka porad gratis)
   
WYSZUKIWARKA I DZIAŁY
całe porady  tytuły
zaznacz działy do przeszukania
(brak wyboru = wszystkie działy)
PHP
MySQL >
PostgreSQL
SQLite
Perl
Java
XML
XSLT
XPath
WML
SVG
RegExp
Wyszukiwarki
Ochrona
VBScript
XHTML/CSS
JavaScript
Grafika
Flash
Photoshop
Windows
Linux
Bash
Apache
Procmail
E-biznes
Explorer
Opera
Firefox
Inne porady
   
KURSY, DOKUMENTACJE
Własne:
XHTML/CSS
JavaScript
ActionScript
WML, RSS, SSI
Pozostałe:
PHP
MySQL
Java API
więcej...
   
użytkowników online: 194
W CZYM MOGĘ POMÓC?


   
USŁUGI
Tworzenie/prowadzenie stron
Pisanie/modyfikacje skryptów
Systemy CMS, bazy danych
Szkolenia, doradztwo, audyty
Fotograf Warszawa
   
OPINIE UŻYTKOWNIKÓW
Porady zamieszczone tutaj przez Darka są pomocne w wielu chwilach. Wielokrotnie tworząc jakiś złożony serwis korzystam z tych porad. Można by tworzyć samemu te skrypty, ale tak naprawdę czy nie lepiej jest wziąć skrypt z tej strony i zmodyfikowac go dla swoich potrzeb? Wprawdzie możemy taki skrypt napisać sami, ale po co, skoro stracimy czas na coś, co ktoś juz napisał, przetestował i może zagwarantować, że działa poprawnie. Któryś raz z rzędu opłacam abonament i nie raz jeszcze opłacę. Kawał dobrej roboty i ogrom wiedzy w jednym miejscu.

Piotr Karamański
Design Studio

   
GALERIA FOTOGRAFII
   
PODRĘCZNIK PHP 5.x, 4.x, 3.x - częściowo spolszczony / źródło: www.php.net

[Spis] [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [M] [N] [O] [P] [Q] [R] [S] [T] [U] [V] [X] [W] [Z]

Liczby całkowite (integer)

Typ integer to liczba całkowita, należąca do przedziału Z = {..., -2, -1, 0, 1, 2, ...}.

Zobacz też: Liczby całkowite dużej wielkości oraz Liczby zmiennoprzecinkowe

Składnia

Liczby całkowite mogą być zapisane w notacji dziesiętnej (opartej na 10), szesnastkowej (opartej na 16) lub ósemkowej (opartej na 8), opcjonalnie poprzedzone znakiem (- lub +).

Aby zapisać liczbę w notacji ósemkowej, należy poprzedzić właściwą liczbę symbolem 0 (zero). W notacji szesnastkowej liczbę należy poprzedzić symbolem 0x.

Przykład 11-1. Notacja liczb całkowitych

$a = 1234; # liczba dziesiętna
$a = -123; # ujemna liczba dziesiętna
$a = 0123; # liczba ósemkowa (odpowiednik dziesiętnej 83)
$a = 0x1A; # liczba szesnastkowa (odpowiednik dziesiętnej 26)
Maksymalna wielkość liczby całkowitej jest zależna od platformy operacyjnej, zwykle jest to około dwa miliardy (jest to 32 bity ze znakiem). PHP nie obsługuje liczb całkowitych bez znaku.

Wyjście poza zakres liczb całkowitych

W przypadku zapisania liczby całkowitej wykraczającej poza zakres typu integer, liczba ta zostanie potraktowana jako typ float. Również jeśli rezultat operacji będzie wykraczał poza typ integer, jako wynik zostanie zwrócony typ float.

$duża_liczba =  2147483647;
var_dump($duża_liczba);
// wynik: int(2147483647)

$duża_liczba =  2147483648;
var_dump($duża_liczba);
// wynik: float(2147483648)

// tak samo dzieje się przy wartościach szesnastkowych:
var_dump( 0x80000000 );
// wynik: float(2147483648)

$million = 1000000;
$duża_liczba =  50000 * $million;
var_dump($duża_liczba);
// wynik: float(50000000000)

Ostrzeżenie

Niestety, błąd w PHP powodował czasem nieprawidłową pracę z liczbami ujemnymi. Na przykład: wynikiem działania -50000 * $million była liczba -429496728. Błąd ten pojawiał się tylko przy liczbach ujemnych i nie dotyczył wartości dodatnich.

Powyższy problem został rozwiązany w PHP 4.1.0.

W PHP nie ma operatora dzielenia całkowitego. 1/2 daje wynik typu float o wartości 0.5.

var_dump( 25/7 );
// wynik: float(3.5714285714286)

Konwersja na liczby całkowite

Do jawnej konwersji wartości na typ integer używa się operatora rzutowania (int) lub (integer). W większości przypadków jednak rzutowanie nie jest potrzebne, gdyż wartość zostanie skonwertowana automatycznie, o ile operator, funkcja lub struktura kontrolna wymaga argumentu typu integer.

Zobacz też wykorzystywanie typów danych.

Z boolowskiej

FALSE będzie mieć wartość 0 (zero), a TRUE będzie mieć wartość 1 (jeden).

Z liczb zmiennoprzecinkowych

Przy konwersji z liczb zmiennoprzecinkowych do całkowitych, liczba zostanie zaokrąglona w dół.

Jeśli liczba zmiennoprzecinkowa jest poza zakresem liczb całkowitych, (zwykle +/- 2.15e+9 = 2^31), wynik operacji rzutowania jest niezdefiniowany, ponieważ liczba zmiennoprzecinkowa nie ma odpowiedniej precyzji, aby zwrócić dokładną liczbę całkowitą. W tej sytuacji nie pojawi się żadne ostrzeżenie ani informacja odnośnie powstałego błędu!

Ostrzeżenie

Nigdy nie należy rzutować nieznanego ułamka do typu integer, gdyż może to doprowadzić do otrzymania nieprzewidywalnych wyników.

echo (int) ( (0.1+0.7) * 10 ); // wyświetla 7!

Więcej informacji na ten temat w rozdziale precyzja liczb zmiennoprzecinkowych.

Z innych typów

Uwaga!

Wynik konwersji do liczb całkowitych z innych typów jest nieokreślony. Obecnie zachowanie jest takie samo, jakby zmienna została najpierw skonwertowana do typu boolowskiego. Nie należy jednak polegać na tym zachowaniu, gdyż może ono ulec zmianie bez żadnego ostrzeżenia.




User Contributed Notes

maffe82 at hotmail
03-Dec-2005 02:02

When I want to print large numbers I use the following function to make them readable. Only works well with numbers < one thousand billion but can easily be extended.

<?php
  
function bignum( $num )
   {
      
$s = "";
       for (
$t = 1000000000; $t >= 1; $t/=1000) {
          
$o = (int) (($num/$t) % 1000);

           if (
$s != "" || $o != 0) {
               if (
$o < 10 && $s != "")
                  
$s .= "00";
               else if (
$o < 100 && $s != "")
                  
$s .= "0";
              
              
$s .= $o;
               if (
$t != 1)
                  
$s .= ".";
           }
       }
       return
$s;
   }
?>


rickard_cedergren at yahoo dot com
27-Jan-2005 10:15

When doing large subtractions on 32 bit unsigned integers the result sometimes end up negative. My example script converts a IPv4 address represented as a 32 bit unsigned integer to a dotted quad (similar to ip2long()), and adds a "fix" to the operation.

   /**************************
   * int_oct($ip)
   * Convert INTeger rep of IP to octal (dotted quad)
   */
   function int_oct($ip) {

     /* Set variable to float */
     settype($ip, float);

     /* FIX for silly PHP integer syndrome */
     $fix = 0;
     if($ip > 2147483647) $fix = 16777216;

     if(is_numeric($ip)) {
         return(sprintf("%u.%u.%u.%u",
               $ip / 16777216,
               (($ip % 16777216) + $fix) / 65536,
               (($ip % 65536) + $fix / 256) / 256,
               ($ip % 256) + $fix / 256 / 256
               )
     );
     }
     else {
         return('');
     }
   }


dave at burtonsys dot com
05-Jun-2004 03:42

Matt, you need to also preserve the minus sign.
Negative integers are integers, too.
-Dave


23-Dec-2003 07:18

Sometimes you need to parse an unsigned
32 bit integer. Here's a function I 've used:
                                                                              
   function parse_unsigned_int($string) {
       $x = (float)$string;
       if ($x > (float)2147483647)
           $x -= (float)"4294967296";
       return (int)$x;
   }


Matt AKA junkie
29-Jul-2003 12:46

Let's say we're in the situation, let's say a from a form, and the what you want from them is an integer. To be nice though, we're going to fix their error of adding anything other than an integer instead of telling them to do it.

function make_int($str) {
# Let's make sure this isn't being done for no reason
if (gettype($str)!="integer") {
# First we'll make it into a "float" (physically speaking) if not already one
$i = preg_replace("/[^0-9.]/", "", $str);
# Then we make it an integer physically
$i = preg_replace("/\.[0-9]*$/", "", $i);
# Finally, we define the integer as an integer
$i = (int) $i;
return $i;
} else {
return $str;
}}

Just to reiterate, this will take the "string" (not the type) inputted, and make it an integer.


adam at forsalebyowner dot com
13-Feb-2003 12:19

Whoah.  The lack of support for > 32 bit integers is really a pain for some things.  Anyway, for bitwise operations requiring a > 32 bit number:

($big42bitInteger & $someSmallInteger)

You can move to mysql or some other db if you're using one anyway:

select id,($big42bitInteger & $someSmallInteger) as isBitwiseAND FROM someTable;

if ($row->isBitwiseAND > 0) {

do stuff;
}


laercio at gcsnet dot com dot br
02-Nov-2002 02:02

Hi,

To easily solve this problem of math operations compile your PHP with --enable-bcmath and use its set of intruction:
 bcadd, bccomp, bcdiv, bcmod, bcmul, bcpow, bcscale, bcsqrt, bcsub.
No more flotpoint problems.
The intruction can be found on this manual.

Laercio Fortes


kennyc at horizondigital dot com
15-Jun-2002 03:57

ONELINE LEADING ZERO ADDER: I kept getting frustrated by php's weak number formatting functions and using the recursive leading zero adders that I've seen in other people code, so here's my quick and easy oneliner for adding leading zero's to any number:

Two digit space:
substr($num+100,1);
0=00
5=05
23=23
3.14=03.14

Four digit space:
substr($num+10000,1);
0=0000
5=0005
23=0023
256=0256
4096=4096
98.6=0098.6

You may want to check first to be sure that your number dosen't already exceed it's character size!


tim at freeman dot little-possums dot net dot invalid
15-Jan-2002 09:20

> there is no risk of rounding errors when doing (int)(n1/n2).

This is not quite true.  Although both n1 and n2 can be represented exactly in a float, their quotient often cannot be.  It is not even guaranteed that for floating-point arithmetic, 6.0/3.0==2.0 exactly.  The floating-point answer may be 1.999...etc, which would round down to 1.


carl at NOSPAM dot thep dot lu dot se
22-Aug-2001 02:51

One note about integer division:
PHP of course has the << and >> operators, so as long as you need to do integer division by a power of 2 you can just shift to the right.
However, as the floating point numbers are 64-bit rather than 32-bit all possible values for a 32-bit int can be represented exactly by a float, so there is no risk of rounding errors when doing (int)(n1/n2).
The overhead of converting to float and back can probably be ignored for an interpreted language like PHP, unless the engine is insanely optimized. (Testing confirms that $a/$b takes only marginally longer than $a>>$b and $a*$b for integers $a and $b.)


 

 
  © 1996-2010 & Reporter.plmiejscao serwisieabonamentwarunki korzystaniaRSSkontakt