Be careful when using % with large numbers.
The code:
<?php
echo 3333333333 % 3
?>
puts out -1 instead of zero!
(Due to the overflow)
Les opérateurs arithmétiques
Vous rappelez-vous des opérations élémentaires apprises à l'école ? Les opérateurs arithmétiques fonctionnent comme elles.
| Exemple | Nom | Résultat |
|---|---|---|
| -$a | Négation | Opposé de $a. |
| $a + $b | Addition | Somme de $a et $b. |
| $a - $b | Soustraction | Différence de $a et $b. |
| $a * $b | Multiplication | Produit de $a et $b. |
| $a / $b | Division | Quotient de $a et $b. |
| $a % $b | Modulo | Reste de $a divisé par $b. |
L'opérateur de division ("/") retourne une valeur à virgule flottante sauf si les 2 opérandes sont des entiers (ou une chaîne de caractères qui a été convertie en entiers) et cette valeur est toujours divisible, auquel cas une valeur entière sera retournée.
Les opérandes du modulo sont converties en entiers (en supprimant la partie décimale) avant exécution.
Le résultat de l'opération modulo % a le même signe que le premier opérande, ansi le résultat de $a % $b aura le signe de $a. Par exemple:
<?php
echo (5 % 3)."\n"; // affiche 2
echo (5 % -3)."\n"; // affiche 2
echo (-5 % 3)."\n"; // affiche -2
echo (-5 % -3)."\n"; // affiche -2
?>
Voir aussi le manuel sur les fonctions mathématiques.
calmarius at atw dot hu ¶
5 years ago
TheWanderer ¶
5 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>";}
}
?>
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.
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.
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)
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)
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)
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.
