2012-10-11 27 views
47

En lenguajes como C o Python, si divido un número entero por un entero, me sale un número entero:número entero Divide y obtener valor entero

>>> 8/3 
2 

Pero en PHP, si divido un entero por otro entero con /, a veces me da un flotador:

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, por lo que es 8/3 2. ¿Cómo puedo hacer que en PHP?

+0

posible duplicado [questions/2055469] (http://stackoverflow.com/questions/2055469/php-typecasting-float-int) –

+0

SI redondea lo anterior, obtendrá '6', ¿qué necesitas 5 o 6? – Starx

+1

@Starx: hay más de un tipo de redondeo: http://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) – zerkms

Respuesta

64

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

round(8/3); // 3 

o

Uso floor() función para obtener valor entero

floor(8/3); // 2 
+6

No estoy de acuerdo. piso (-8/3) === -3.0 pero debe ser -2 – ByScripts

+6

Tenga en cuenta que 'floor()' devolverá un 'float' NO un entero, por lo que obtiene' 2.0' y no '2'. Envía el resultado para asegurarte de que obtienes un entero: '(int) floor (8/3)' – Jason

+0

@ByScripts * -8/3 = -3 * es una forma igual de válida para que la división entera funcione como * -8/3 = -2 *. El primero es "truncamiento hacia el infinito negativo", y el último es "truncamiento hacia cero". Ambos tienen ventajas, y diferentes idiomas eligen diferentes comportamientos. Por ejemplo, C trunca hacia cero (al igual que PHP 7's 'intdiv'), mientras que Python trunca hacia el infinito negativo. –

19

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


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

PhP manual

3

uso esto ....

intval(1700000/300000)... 

Esto devuelve el valor entero.

3
(int)(1700000/300000); 

use type casting.

+4

¡Nunca hagas flotar a int! "7" !!! –

+3

¡Aw! Simplemente porque (0.1 + 0.7) == 0.799999 ... en vez de 0.8 :) :) :) –

+2

@ luc.chante el ejemplo que das ocurre debido a un error de coma flotante. El valor exacto de '(0.1 + 0.7) * 10' es' 7.99999999999999911182158029987476766109466552734375'. Es perfectamente correcto que un molde '(int)' trunca este valor a 7. Al dividir un entero por otro entero, como es el caso en la pregunta y la respuesta aquí, dicho error de coma flotante no puede cambiar el resultado del post-truncamiento. –

30

En PHP 7, existe la función intdiv haciendo exactamente lo que desea.

Uso:

intdiv(8, 3); 

devoluciones 2.

+1

Realmente es una gran sorpresa que esta función solo se presente con PHP 7 :) Bueno, mejor tarde que nunca. –

1

se puede utilizar el formato abreviado añadiendo | 0 hasta el final

8/3 | 0

+2

-1; esto es un abuso confuso del operador "bitwise". Es verdad que * funciona * (dado que los operandos en operadores bit a bit se convierten en enteros, lo que redondea los valores flotantes, y la operación real en bit o con 0 no causa cambios en el valor entero resultante), pero para que un desarrollador lea esto código para entender * por qué * funciona necesitan conocer el comportamiento de casting de los operadores bit a bit de PHP (que es conocimiento trivial oscuro 99% de desarrolladores PHP no tendrán) y que un bitwise o con 0 deja un valor sin cambios (no garantizado , ya que no todos los desarrolladores web entienden las operaciones de bits). –

+0

@MarkAmery, el hecho de que los desarrolladores no lo sepan no significa que no funcione. Y, obviamente, esa es una buena razón para votar, para que las personas aprendan cómo usarlo. – Besi

+1

código de golf para la victoria –

3

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

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

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

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

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

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

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

En PHP 7 se pueden utilizar para llevar a cabo directamente intdiv($p, $q) división entera. Esto es equivalente a (int)($p/$q) en PHP 5.

+1

Tenga en cuenta que no todos los enfoques mostrados aquí tienen el mismo tipo de retorno: las llamadas '(int)' cast y 'intdiv()' devuelven ints, pero 'round()' y 'floor()' ambas devuelven flotantes. –