2012-10-11 18 views
47

in linguaggi come C o Python, se divido un numero intero da un numero intero, ottengo un numero intero:Divide intero e ottenere valore intero

>>> 8/3 
2 

Ma in PHP, se divido un numero intero da un altro intero con /, a volte ho un galleggiante:

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

mi piacerebbe fare la divisione come in Python o C, in modo che 8/3 è 2. Come posso farlo in PHP?

+0

possibile duplicato [domande/2055469] (http://stackoverflow.com/questions/2055469/php-typecasting-float-int) –

+0

Se arrotondate quanto sopra, otterrete '6', cosa ti serve 5 o 6? – Starx

+1

@Starx: esistono più tipi di arrotondamento: http://en.wikipedia.org/wiki/Rounding#Tie-breaking. Quindi se giri intorno a 5.6 - non sai cosa ottieni (senza specificare come vuoi che sia arrotondato) – zerkms

risposta

64

utilizzare la funzione round() per ottenere il valore intero arrotondato.

round(8/3); // 3 

o

Usa floor() funzione per ottenere valore intero

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

Non sono d'accordo. floor (-8/3) === -3.0 ma dovrebbe essere -2 – ByScripts

+6

Si noti che 'floor()' restituirà un 'float' NON un intero, quindi si ottiene' 2.0' e non '2'. Trasmetti il ​​risultato per assicurarti di ottenere un numero intero: '(int) floor (8/3)' – Jason

+0

@ByScripts * -8/3 = -3 * è un modo altrettanto valido per la divisione integer di funzionare come * -8/3 = -2 *. Il primo è "troncamento verso l'infinito negativo", e il secondo è "troncatura verso zero". Entrambi hanno dei vantaggi e lingue diverse scelgono comportamenti diversi. Ad esempio, C tronca verso zero (come fa 'intdiv' di PHP 7), mentre Python tronca verso l'infinito negativo. –

19

v'è alcun operatore divisione intera in PHP. 1/2 produce il galleggiante 0,5. Il valore può essere convertito in un numero intero per arrotondarlo verso il basso, oppure la funzione round() fornisce un controllo più preciso sull'arrotondamento.


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 questo ....

intval(1700000/300000)... 

questo restituisce il valore intero.

3
(int)(1700000/300000); 

utilizzo tipo casting.

+4

Non trasmettere mai float a int !!! "7" !!! –

+3

Aw! Solo perché (0,1 + 0,7) == 0,799999 ... invece di 0.8 :) :) :) –

+2

@ luc.chante l'esempio che si dà avviene a causa di un errore in virgola mobile. Il valore esatto di '(0,1 + 0,7) * 10' è' 7.99999999999999911182158029987476766109466552734375'. È perfettamente corretto che un cast '(int)' tronca questo valore a 7. Quando si divide un numero intero da un altro intero, come nel caso della domanda e della risposta, tale errore in virgola mobile non può modificare il risultato del troncamento. –

30

In PHP 7, c'è la funzione intdiv che fa esattamente ciò che si desidera.

Usage:

intdiv(8, 3); 

Returns 2.

+1

Questa è davvero una grande sorpresa questa funzione è stata introdotta solo con PHP 7 :) Oh beh, meglio tardi che mai. –

1

è possibile utilizzare lo Shortform aggiungendo | 0 alla fine

8/3 | 0

+2

-1; questo è un abuso confuso dell'operatore "bitwise o". Certo, funziona * (dato che gli operandi agli operatori bit a bit ottengono il cast sugli interi, che arrotonda i valori verso il basso e l'operazione effettiva di bit o 0 non modifica il valore intero risultante), ma per un dev che legge questo codice per capire * perché * funziona hanno bisogno di conoscere sia il comportamento di cast degli operatori bitwise di PHP (che è oscura conoscenza trivia il 99% degli sviluppatori PHP non avrà) e che un bit a bit o con 0 lascia un valore invariato (non garantito , poiché non tutti gli sviluppatori Web comprendono le operazioni bit). –

+0

@MarkAmery, il fatto che gli sviluppatori Mos non ne sappiano non significa che non funzioni. E ovviamente questa è una buona ragione per andare avanti, quindi le persone imparerebbero come usarlo. – Besi

+1

codice golfing per la vittoria –

3

Ci sono diversi modi per eseguire divisione intera in PHP. La lingua non ha un operatore per la divisione intera, ma ci sono diverse opzioni per arrotondare il punto di quoziente mobile in un intero:

<?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 

su PHP 7 è possibile utilizzare intdiv($p, $q) per eseguire direttamente divisione intera. Questo è equivalente a su PHP 5.

+1

Nota che non tutti gli approcci qui mostrati hanno lo stesso tipo di ritorno - il cast '(int)' e 'intdiv()' restituiscono int, ma 'round()' e 'floor()' entrambi restituiscono float. –

Problemi correlati