Be careful when using % with large numbers.
The code:
<?php
echo 3333333333 % 3
?>
puts out -1 instead of zero!
(Due to the overflow)
Operatori aritmetici
Ricordate l'aritmetica di base dalla scuola? Questi operatori funzionano esattamente nello stesso modo.
| Esempio | Nome | Risultato |
|---|---|---|
| -$a | Negazione | Opposto di $a. |
| $a + $b | Addizione | La somma di $a e $b. |
| $a - $b | Sottrazione | La differenza di $a e $b. |
| $a * $b | Moltiplicazione | il prodotto di $a e $b. |
| $a / $b | Divisione | Quoziente di $a e $b. |
| $a % $b | Modulo | Il resto di $a diviso da $b. |
L'operatore di divisione ("/") restituisce un valore float a meno che i due operandi siano interi (oppure stringhe che vengono convertite in interi) e i numeri siano divisibili, nel qual caso viene restituito un valore intero.
Gli operandi del modulo sono convertiti a interi (rimuovendo la parte decimale) prima dell'operazione.
Il risultato dell'operatore modulo % ha lo stesso segno del dividendo - ovvero, il risultato di $a % $b avrà lo stesso segno di $a. Per esempio:
<?php
echo (5 % 3)."\n"; // prints 2
echo (5 % -3)."\n"; // prints 2
echo (-5 % 3)."\n"; // prints -2
echo (-5 % -3)."\n"; // prints -2
?>
Vedere anche le pagine del manuale sulle funzioni matematiche.
calmarius at atw dot hu ¶
5 years ago
TheWanderer ¶
4 years ago
It is worth noticing that when working with large numbers, most noticably using the modulo operator, the results depend on your CPU architecture. Therefore, running a decent 64-bit machine will be to your advantage in case you have to perform complex mathematical operations. Here is some example code - you can compare its output on x86 and x86_64 machines:
<?php
/* tested under PHP 5.2.6-1 with Suhosin-Patch 0.9.6.2 (cli) on both i386 and amd64, Debian lenny/sid */
$a = 2863311530;
$b = 256;
$c = $a % $b;
echo "$c <br />\n";
echo (2863311530 % 256)." <br />\n"; /* directly with no variables, just to be sure */
?>
The code is expected to produce '170' if working correctly (try it in spreadsheet software).
Jonathon Reinhart ¶
6 years ago
A very simple yet maybe not obvious use of the modulus (%) operator is to check if an integer is odd or even.
<?php
if (($a % 2) == 1)
{ echo "$a is odd." ;}
if (($a % 2) == 0)
{ echo "$a is even." ;}
?>
This is nice when you want to make alternating-color rows on a table, or divs.
<?php
for ($i = 1; $i <= 10; $i++) {
if(($i % 2) == 1) //odd
{echo "<div class=\"dark\">$i</div>";}
else //even
{echo "<div class=\"light\">$i</div>";}
}
?>
antickon at gmail dot com ¶
1 year ago
not listed here is the absolutely useless unary plus.
<?php
$a = -3;
$a = +$a;
var_dump( $a ); // int(-3)
arjini at gmail dot com ¶
8 years ago
When dealing purely with HTML, especially tables, or other things in "grids" the modulous operator is really useful for splitting up the data with a seperator.
This snippet reads any gif files from the directory the script is in, prints them out and puts in a break every 5th image.
<?php
$d = dir('./');
$i = 0;
while(false !== ($e = $d->read())){
if(strpos($e,'.gif')){
++$i;
echo '<img src="'.$e.'"/>'.chr(10);
if(!($i%5))
echo '<br/>';
}
}
?>
For tables just put </tr><tr> in place of the break.
info at sima-pc dot com ¶
9 years ago
Note that operator % (modulus) works just with integers (between -214748348 and 2147483647) while fmod() works with short and large numbers.
Modulus with non integer numbers will give unpredictable results.
pww8 at cornell dot edu ¶
7 years ago
It appears floating-point infinity (INF) is not returned from divide by zero (in PHP 5.0.0). Instead a warning is given and Boolean FALSE is returned.
I searched the various manuals and did not find relevant explanation, so am adding this.
glenn at benge dot co dot nz ¶
8 years ago
a real simple method to reset an integer to a the next lowest multiple of a divisor
$startSeq = $startSeq - ($startSeq % $entriesPerPage);
if $startSeq was already a multiple, then " $startSeq % $entriesPerPage " will return 0 and $startSeq will not change.
soren at byu dot edu ¶
9 years ago
Exponentiation doesn't use ^ or ** as you might be used to with other languages. To calculate "z equals y to the x" use:
$z = pow(y,x)
php at richardneill dot org ¶
2 years ago
For larger numbers (above PHP_INT_MAX), use fmod() rather than %.
The other operators (+-*/) work correctly with floats and integer overflow, but % uses integer wrap. Eg.
<?php
var_dump(0xffffffff % 2);
//Prints int(-1) which is WRONG
var_dump(intval(fmod(0xffffffff,2)));
//Prints int(1) which is the right answer
?>
(The reason this matters is that PHP's float is actually a double, and can accurately represent integers up to 52-bits, even on 32-bit systems)
