intdiv
(PHP 7)
intdiv — Integer division
Описание
int intdiv
( int
$dividend
, int $divisor
)
Returns the integer quotient of the division of dividend
by divisor
.
Список параметров
-
dividend
-
Number to be divided.
-
divisor
-
Number which divides the
dividend
.
Возвращаемые значения
The integer quotient of the division of dividend
by divisor
.
Ошибки
If divisor
is 0, a DivisionByZeroError
exception is thrown. If the dividend
is PHP_INT_MIN
and the divisor
is -1, then an
ArithmeticError exception is thrown.
Примеры
Пример #1 intdiv() example
<?php
var_dump(intdiv(3, 2));
var_dump(intdiv(-3, 2));
var_dump(intdiv(3, -2));
var_dump(intdiv(-3, -2));
var_dump(intdiv(PHP_INT_MAX, PHP_INT_MAX));
var_dump(intdiv(PHP_INT_MIN, PHP_INT_MIN));
var_dump(intdiv(PHP_INT_MIN, -1));
var_dump(intdiv(1, 0));
?>
int(1) int(-1) int(-1) int(1) int(1) int(1) Fatal error: Uncaught ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer in %s on line 8 Fatal error: Uncaught DivisionByZeroError: Division by zero in %s on line 9
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Математические расширения
- Математические функции
- abs
- acos
- acosh
- asin
- asinh
- atan2
- atan
- atanh
- base_convert
- bindec
- ceil
- cos
- cosh
- decbin
- dechex
- decoct
- deg2rad
- exp
- expm1
- floor
- fmod
- getrandmax
- hexdec
- hypot
- intdiv
- is_finite
- is_infinite
- is_nan
- lcg_value
- log10
- log1p
- log
- max
- min
- mt_getrandmax
- mt_rand
- mt_srand
- octdec
- pi
- pow
- rad2deg
- rand
- round
- sin
- sinh
- sqrt
- srand
- tan
- tanh
Коментарии
$a = 57;
$b = 3;
var_dump(
intdiv($a,$b),
intdiv_1($a,$b),
intdiv_2($a,$b)
);
function intdiv_1($a, $b){
return ($a-$a%$b)/$b;
}
function intdiv_2($a, $b){
return floor($a/$b);
}
//intdiv($a, $b) == floor($a/$b) == ($a-$a%$b)/$b
This does indeed seem to be equal to intdiv:
<?php
function intdiv_1($a, $b){
return ($a - $a % $b) / $b;
}
?>
However, this isn't:
<?php
function intdiv_2($a, $b){
return floor($a / $b);
}
?>
Consider an example where either of the parameters is negative:
<?php
$param1 = -10;
$param2 = 3;
print_r([
'modulus' => intdiv_1($param1, $param2),
'floor' => intdiv_2($param1, $param2),
]);
/**
* Array
* (
* [modulus] => -3
* [floor] => -4
* )
*/
?>
Without intdiv(), the following may be a good way (with $a and $b of type integer and not too big) :
<?php
(int)($a / $b)
?>
because in case of divisible integers, the result will be integer and there is no risk of float appearing round but below their represented value (like the case (0.1+0.7)*10).
$a and $b really needs to be of type integer though.
If they are too big and indivisible, some precision will be lost during the conversion to float and the result may be inaccurate.
<?php
function intdiv_2($a, $b) {
$val = $a / $b;
return ($val < 0 ? "ceil" : "floor") ($val);
}
?>
Aren't this?!
@AmeenRoss
This does NOT seem to be equal to intdiv:
<?php
function intdiv_1($a, $b){
return ($a - $a % $b) / $b;
}
?>
See this example code
<?php
$x = 5.6;
$y = 1.4 ;
echo intdiv($x,$y);
echo "\n";
function intdiv_1($a, $b){
return ($a - $a % $b) / $b;
}
echo intdiv_1($x,$y);
?>
//Output
5
4
For earler versions PHP you may use:
function intdiv_1($a, $b) {
$a = (int) $a;
$b = (int) $b;
return ($a - fmod($a, $b)) / $b;
}
Python style integer division, where the result is always rounded towards minus infinity.
1 // 2 is 0
(-1) // 2 is -1
1 // (-2) is -1
(-1) // (-2) is 0
<?php
function intdiv_py(int $num1, int $num2): int{
if ($num1 < 0 xor $num2 < 0){
$num1 = abs($num1);
$num2 = abs($num2);
$remainder = $num1 % $num2;
return $remainder ? -1 -($num1 - $remainder) / $num2 : -$num1 / $num2;
}
return intdiv($num1, $num2);
}
var_dump(intdiv_py(1, 2)); // 0
var_dump(intdiv_py(-1, 2)); // -1
var_dump(intdiv_py(1, -2)); // -1
var_dump(intdiv_py(-1, -2)); // 0
?>