Dividir entero y obtener un valor entero

83

En lenguajes como C o Python, si divido un número entero por un número entero, obtengo un número entero:

>>> 8/3
2

Pero en PHP, si divido un número entero por otro entero con /, a veces obtengo un flotante:

php > var_dump(6/3);
int(2)
php > var_dump(8/3);
float(2.6666666666667)

Me gustaría hacer una división como en Python o C, de modo que 8/3 sea 2. ¿Cómo puedo hacer eso en PHP?

Ismail Saleh
fuente
posibles preguntas
Kanti Paul
Si redondea lo anterior, obtendrá 6, ¿qué necesita 5 o 6?
Starx
1
@Starx: hay más de un tipo de redondeo: en.wikipedia.org/wiki/Rounding#Tie-breaking . Entonces, si redondeas 5.6, no sabes lo que obtienes (sin especificar cómo quieres que se
redondee
1
@zerkms, sí, de hecho funcionan como ceil()y floor()son las funciones las que redondean de manera diferente.
Starx

Respuestas:

94

use la round()función para obtener un valor entero redondeado.

round(8 / 3); // 3

o

Utilice la floor()función para obtener un valor entero

floor(8 / 3); // 2
iLaYa ツ
fuente
10
No estoy de acuerdo. piso (-8 / 3) === -3.0 pero debería ser -2
ByScripts
14
Tenga en cuenta que floor()devolverá un floatNO un número entero, por lo que obtiene 2.0y no 2. Transmita el resultado para asegurarse de obtener un número entero:(int)floor(8/3)
Jason
2
@ByScripts -8/3 = -3 es una forma tan válida para que la división de enteros funcione como -8/3 = -2 . El primero es "truncamiento hacia infinito negativo" y el segundo es "truncamiento hacia cero". Ambos tienen ventajas y los diferentes idiomas eligen comportamientos diferentes. Por ejemplo, C se trunca hacia cero (al igual que PHP 7 intdiv), mientras que Python se trunca hacia el infinito negativo.
Mark Amery
Tenga en cuenta que ceil () siempre se redondea.
Ales
70

En PHP 7, hay una función intdiv que hace exactamente lo que quieres.

Uso:

intdiv(8, 3);

Devoluciones 2.

Marek Lisý
fuente
4
Realmente es una gran sorpresa, esta función solo se introdujo con PHP 7 :) Bueno, más vale tarde que nunca.
Eric Gopak
1
¿Hay alguna solución como esta en php 5.6
Usman Ali Maan
1
No es tan sencillo como esto, no. En PHP 5.6, use la respuesta aceptada :)
Marek Lisý
21

No hay un operador de división de enteros en PHP. 1/2 produce el flotador 0.5. El valor se puede convertir en un número entero para redondearlo hacia abajo, o la función round () proporciona un control más preciso sobre el redondeo.


var_dump(25/7);           // float(3.5714285714286)    
var_dump((int) (25/7));   // int(3)   
var_dump(round(25/7));    // float(4)     

Manual de PhP

SP
fuente
7

utilizar esta....

intval(1700000 / 300000 )...

esto devuelve el valor entero.

bipen
fuente
6
(int)(1700000 / 300000);

utilizar tipo de fundición.

Mahipal purohit
fuente
4
¡Aw! Solo porque (0.1 + 0.7) == 0.799999 ... en lugar de 0.8 :) :) :)
Jesse Chisholm
3
@ luc.chante el ejemplo que das ocurre debido a un error de punto flotante. El valor exacto de (0.1 + 0.7) * 10es 7.99999999999999911182158029987476766109466552734375. Es perfectamente correcto que una (int)conversión trunca este valor a 7. Al dividir un entero por otro entero, como es el caso en la pregunta y respuesta aquí, tal error de punto flotante no puede cambiar el resultado posterior al truncamiento.
Mark Amery
Esto reproduce el comportamiento exacto como se esperaba en C / C ++ cuando se hace una división de enteros, por lo que no veo ningún problema.
Alexis Wilke
6

Hay varias formas de realizar la división de enteros en PHP. El lenguaje no tiene un operador para la división de enteros, pero hay varias opciones para redondear el cociente de punto flotante a un entero:

<?php
$pos = 1;
$neg = -1;
$divisor = 2;

// No rounding (float division)
var_dump($pos / $divisor);          //  0.5 (float)
var_dump($neg / $divisor);          // -0.5 (float)

// Round toward zero (like C integer division)
var_dump((int)($pos / $divisor));   //  0 (int)
var_dump((int)($neg / $divisor));   //  0 (int)

// Round half away from zero
var_dump(round($pos / $divisor));   //  1 (float)
var_dump(round($neg / $divisor));   // -1 (float)

// Round down
var_dump(floor($pos / $divisor));   //  0 (float)
var_dump(floor($neg / $divisor));   // -1 (float)

# And on PHP 7 you can round toward zero with intdiv():
var_dump(intdiv($pos, $divisor));   //  0 (int)
var_dump(intdiv($neg, $divisor));   //  0 (int)  Rounded toward zero

En PHP 7 se puede utilizar intdiv($p, $q)para realizar directamente la división de enteros. Esto es equivalente a (int)($p / $q)PHP 5.

Colin D. Bennett
fuente
5

Puede usar la forma abreviada agregando | 0 al final

8/3 | 0

Besi
fuente
3
-1; esto es un abuso confuso del operador "bit a bit o". Es cierto que funciona (ya que los operandos a los operadores bit a bit se convierten en enteros, lo que redondea los valores flotantes hacia abajo, y la operación real de bit a bit o con 0 no causa ningún cambio en el valor entero resultante), pero para que un desarrollador lea este código para entienden por qué funciona, necesitan saber tanto el comportamiento de conversión de los operadores bit a bit de PHP (que es un conocimiento oscuro de trivia que el 99% de los desarrolladores de PHP no tendrán) y que un bit a bit o con 0 deja un valor sin cambios (no garantizado, ya que no todos los desarrolladores web entienden las operaciones de bits).
Mark Amery
1
@MarkAmery, el hecho de que la mayoría de los desarrolladores no lo sepan no significa que no funcione. Y obviamente esa es una buena razón para votar a favor, para que la gente aprenda a usarlo.
Besi
2
sí, es confuso, por lo que no debe usarse en el código de producción, pero no cambia el hecho de que es una solución interesante al problema
Tomasz Swider
@TomaszSwider algunas personas también pueden buscar la solución más corta (especialmente en algunos desafíos de código).
Besi
1
Esto se usa en JavaScript todo el tiempo. Los programadores ya deberían estar al tanto de este truco ...
Alexis Wilke
4

PARA PHP 7, prueba la intdiv()función:

Sintaxis: int intdiv($dividend, $divisor)

          <?php           
           $dividend = 19; 
           $divisor = 3;  
           echo intdiv($dividend, $divisor); 
           ?>

Para versiones anteriores de PHP:

         <?php
     // Convert $total_minutes to hours and minutes.

         $total_minutes = 640;
         $minutes = $total_minutes % 60;
         $hours = ($total_minutes - $minutes) / 60;

         echo "Time taken was $hours hours $minutes minutes";
         ?>
Aamir Kalimi
fuente
A agosto de 2019, esta es la única respuesta correcta.
DomQ
1

Para PHP versión 7 => intdiv(a,b)

Y para versiones menores a 7 (como 5.6) => (int)floor(abs(a/b))

sanjay.chouhan180
fuente
No funciona con números enteros grandes. Ver stackoverflow.com/questions/54606140
Wiimm