Арифметические операторы

Помните школьные основы арифметики? Описанные ниже операторы работают так же.

Арифметические операции
Пример Название Результат
-$a Отрицание Смена знака $a.
$a + $b Сложение Сумма $a и $b.
$a - $b Вычитание Разность $a и $b.
$a * $b Умножение Произведение $a и $b.
$a / $b Деление Частное от деления $a на $b.
$a % $b Деление по модулю Целочисленный остаток от деления $a на $b.

Операция деления ("/") возвращает число с плавающей точкой, кроме случая, когда оба значения являются целыми числами (или строками, которые преобразуются в целые числа), которые делятся нацело - в этом случае возвращается целое значение.

При делении по модулю операнды преобразуются в целые числа (удалением дробной части) до начала операции.

Результат операции остатка от деления % будет иметь тот же знак, что и делимое — то есть, результат $a % $b будет иметь тот же знак, что и $a. Например:


echo (3)."\n";           // выводит 2
echo (% -3)."\n";          // выводит 2
echo (-3)."\n";          // выводит -2
echo (-% -3)."\n";         // выводит -2


Также вы можете ознакомиться с разделом документации Математические функции.


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.
2004-05-01 17:48:33
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.

$i 0;
false !== ($e $d->read())){
'<img src="'.$e.'"/>'.chr(10);

For tables just put </tr><tr> in place of the break.
2004-09-08 12:48:36
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.
2004-10-06 02:28:57
A very simple yet maybe not obvious use of the modulus (%) operator is to check if an integer is odd or even.
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.

for ($i 1$i <= 10$i++) {
$i 2) == 1//odd
{echo "<div class=\"dark\">$i</div>";}
{echo "<div class=\"light\">$i</div>";}
2006-10-16 05:11:54
Be careful when using % with large numbers.

The code:

echo 3333333333 3

puts out -1 instead of zero!

(Due to the overflow)
2008-05-15 09:19:17
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:
/* tested under PHP 5.2.6-1 with Suhosin-Patch (cli) on both i386 and amd64, Debian lenny/sid */
$a 2863311530;
$b 256;
$c $a $b;
"$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).
2008-06-05 06:52:03
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.

(0xffffffff 2);
//Prints  int(-1)   which is WRONG

//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)
2011-04-18 11:13:23
The % operator doesn't behave as many people with a maths background would expect, when dealing with negative numbers. For example, -1 mod 8 = 7, but in PHP, -1 % 8 = -1.

The following function has the expected behaviour:

function mod($a, $n) {
    return ($a % $n) + ($a < 0 ? $n : 0);

mod(-1, 8) returns 7 as expected.
2013-07-17 17:10:52
If you are running a php version older than 5.6, you can calculate $a ** $b by using exp($b*log($a))
2014-09-09 08:50:10
In addition to Jonathan's comment, there is a way simpler way to determine if an integer is even or not:

<? $odd $i 2?> 
<? $even = !($i 2); ?>

This works because a modulo division by 2 will always return either 0 or the rest 1. Since those are valid boolean values you can just invert them by adding a prefixed ! if wanted.
2014-12-05 15:01:07
The modulus operator is very poorly suited for such a simple operation as determining if an int is even or odd. On most common systems, modulus performs a division, which is a very slow operation.
A much better way to find if a number is even or odd is to use the bitwise & operator.


$is_odd = $x & 1; //using and
$is_odd = $x % 2; //using modulus
2017-02-16 18:57:21
If you need the mathematical modulo (always positive) from negative numbers, use this small function:

function modulo($a $b) { return ($a $b) % $b; }

// examples:
echo modulo(1512);  // 3
echo modulo(-912);  // 3
2017-07-07 13:01:09
To get a positiv result

function modulo(int $a, int $b):?int {
  if ($b == 0) {
    throw new Exception('modulo : second operand must not be zero');
  $b = abs($b);
  // test $b == 1 for performance when $a < 0
  return ($b == 1) ? 0 : (($a < 0) ? modulo($a + $b, $b) : $a % $b);
2017-11-15 14:06:24
For positive modulos, here is a mathematically proper modulo which actually works with negative integers.

// Inline: $v is value to be divided, $m is the modulus
$remainder = ( $v $m $m ) % $m;

// Or as a function:
function modulo$value$modulus ){
  return ( 
$value $modulus $modulus ) % $modulus;

// Test:
for( $x = -6$x <= 6; ++$x )  echo $x"\t"modulo$x), "\t<br>\n";
/* prints:
-6  0
-5  1
-4  2
-3  0
-2  1
-1  2
 0  0
 1  1
 2  2
 3  0
2019-06-18 21:18:37
With % (modulo), it looks like php uses the C operator (apart from some sanity-checks), according to following `awk` command, getting the relevant lines of arbitrary commits (dbb462db5d and 04d5086578 for me) in github.com/php/php-src:

$ awk '!F[0]&&/expr '\''%'\'' expr/{p()} !F[0]&&/case ZEND_MOD/{p();F[0]=1;F[1]="return"} !F[0]&&/mod_function\(.*\)/{p();F[0]=2;F[1]="ZVAL_LONG"} '$(: function p for printing and array F for finding in files follows: )' F[0]&&match($0,F[1])&&1==F[0]--{p();delete F;nextfile}function p(){print FILENAME":"FNR":\t"$0}' Zend/zend_{language_parser.y,{opcode,operators}.c}
Zend/zend_language_parser.y:939:        |    expr '%' expr     { $$ = zend_ast_create_binary_op(ZEND_MOD, $1, $3); }
Zend/zend_opcode.c:1042:            case ZEND_MOD:
Zend/zend_opcode.c:1043:                return (binary_op_type) mod_function;
Zend/zend_operators.c:1333:    ZEND_API int ZEND_FASTCALL mod_function(zval *result, zval *op1, zval *op2) /* {{{ */
Zend/zend_operators.c:1362:        ZVAL_LONG(result, op1_lval % op2_lval);
2019-10-18 04:20:58

    Поддержать сайт на родительском проекте КГБ