略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: intdiv

2024-11-15

intdiv

(PHP 7, PHP 8)

intdiv对除法结果取整

说明

intdiv(int $dividend, int $divisor): int

返回 dividend 除以 divisor 商数的整数部分。

参数

dividend

被除数。

divisor

除数。

返回值

dividend 除以 divisor 的商,对该商取整。

错误/异常

如果 divisor0,将抛出 DivisionByZeroError 异常。 如果 dividendPHP_INT_MIN 并且 divisor-1,将抛出 ArithmeticError 异常.

范例

示例 #1 intdiv() 的一些例子

<?php
var_dump
(intdiv(32));
var_dump(intdiv(-32));
var_dump(intdiv(3, -2));
var_dump(intdiv(-3, -2));
var_dump(intdiv(PHP_INT_MAXPHP_INT_MAX));
var_dump(intdiv(PHP_INT_MINPHP_INT_MIN));
var_dump(intdiv(PHP_INT_MIN, -1));
var_dump(intdiv(10));
?>
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
add a noteadd a note

User Contributed Notes 7 notes

up
36
AmeenRoss
6 years ago
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
* )
*/
?>
up
4
sree dot millu at gmail dot com
2 years ago
@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
up
1
oittaa
4 months ago
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
?>
up
-19
polettog at gmail dot com
6 years ago
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.
up
-26
Ts.Saltan
7 years ago
$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
up
-10
admin at infis dot net dot ru
2 years ago
For earler versions PHP you may use:

function intdiv_1($a, $b) {
    $a = (int) $a;
    $b = (int) $b;
    return ($a - fmod($a, $b)) / $b;
}
up
-35
Bubonic dot pestilence at gmail dot com
6 years ago
<?php

function intdiv_2($a, $b)  {
   
$val = $a / $b;
    return (
$val < 0 ? "ceil" : "floor") ($val);
}

?>

Aren't this?!

官方地址:https://www.php.net/manual/en/function.intdiv.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3