Podziel liczbę całkowitą i uzyskaj wartość całkowitą

85

W językach takich jak C czy Python, jeśli podzielę liczbę całkowitą przez liczbę całkowitą, otrzymam liczbę całkowitą:

>>> 8/3
2

Ale w PHP, jeśli podzielę liczbę całkowitą przez inną liczbę całkowitą /, czasami otrzymuję liczbę zmiennoprzecinkową:

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

Chciałbym zrobić podział tak jak w Pythonie lub C, tak aby 8/3 to 2. Jak mogę to zrobić w PHP?

Ismail Saleh
źródło
możliwe zduplikowane pytania / 2055469
Nikson Kanti Paul
JEŚLI zaokrąglisz powyższe, otrzymasz 6, czego potrzebujesz 5 lub 6?
Starx
1
@Starx: istnieje więcej niż jeden typ zaokrąglania: en.wikipedia.org/wiki/Rounding#Tie-breaking . Więc jeśli zaokrągliłeś 5.6 - nie wiesz, co otrzymujesz (bez określania, jak chcesz, aby było zaokrąglane)
zerkms
1
@zerkms, Tak, rzeczywiście działają podobnie ceil()i floor()są funkcjami, które zaokrągla się w inny sposób.
Starx

Odpowiedzi:

94

użyj round()funkcji, aby uzyskać zaokrągloną wartość całkowitą.

round(8 / 3); // 3

lub

Użyj floor()funkcji, aby uzyskać wartość całkowitą

floor(8 / 3); // 2
iLaYa ツ
źródło
10
Nie zgadzaj się. floor (-8 / 3) === -3.0, ale powinno być -2
ByScripts Kwietnia
14
Zwróć uwagę, że floor()zwróci floatNIE liczbę całkowitą, więc otrzymujesz 2.0i nie 2. Rzuć wynik, aby upewnić się, że otrzymasz liczbę całkowitą:(int)floor(8/3)
Jason
2
@ByScripts -8/3 = -3 jest tak samo poprawnym sposobem działania dzielenia liczb całkowitych, jak -8/3 = -2 . Pierwsza to „obcięcie w kierunku ujemnej nieskończoności”, a druga to „obcięcie w kierunku zera”. Obie mają zalety, a różne języki wybierają różne zachowania. Na przykład C skraca się do zera (podobnie jak PHP 7 intdiv), podczas gdy Python obcina do ujemnej nieskończoności.
Mark Amery,
Zauważ, że ceil () jest zawsze zaokrąglane w górę.
Alees
73

W PHP 7 jest funkcja intdiv, która robi dokładnie to, co chcesz.

Stosowanie:

intdiv(8, 3);

Zwroty 2.

Marek Lisý
źródło
5
To naprawdę wielka niespodzianka, ta funkcja została wprowadzona dopiero w PHP 7 :) No cóż, lepiej późno niż wcale.
Eric Gopak
1
czy jest jakieś takie rozwiązanie w php 5.6
Usman Ali Maan
1
Nie tak proste, jak to, nie. W PHP 5.6 użyj zaakceptowanej odpowiedzi :)
Marek Lisý
23

W PHP nie ma operatora dzielenia liczb całkowitych. 1/2 daje wartość zmiennoprzecinkową 0,5. Wartość można rzutować na liczbę całkowitą, aby zaokrąglić ją w dół, lub funkcja round () zapewnia lepszą kontrolę nad zaokrąglaniem.


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

Podręcznik PhP

SP
źródło
8

Użyj tego....

intval(1700000 / 300000 )...

zwraca wartość całkowitą.

bipen
źródło
5
(int)(1700000 / 300000);

użyj rzutowania typów.

mahipal purohit
źródło
4
Aw! Tylko dlatego, że (0,1 + 0,7) == 0,799999 ... zamiast 0,8 :) :) :)
Jesse Chisholm
3
@ luc.chante podany przykład dzieje się z powodu błędu zmiennoprzecinkowego. Dokładna wartość (0.1 + 0.7) * 10to 7.99999999999999911182158029987476766109466552734375. Jest całkowicie poprawne, że (int)rzutowanie obcina tę wartość do 7. Podczas dzielenia liczby całkowitej przez inną liczbę całkowitą, tak jak w przypadku pytania i odpowiedzi tutaj, taki błąd zmiennoprzecinkowy nie może zmienić wyniku po obcięciu.
Mark Amery,
To odtwarza dokładnie takie zachowanie, jakiego oczekiwano w C / C ++ podczas dzielenia liczb całkowitych, więc nie widzę żadnego problemu.
Alexis Wilke
5

Istnieje kilka sposobów wykonywania dzielenia liczb całkowitych w PHP. Język nie ma operatora dzielenia liczb całkowitych, ale istnieje kilka opcji zaokrąglania ilorazu zmiennoprzecinkowego do liczby całkowitej:

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

W PHP 7 możesz użyć intdiv($p, $q)do bezpośredniego dzielenia liczb całkowitych. Jest to odpowiednik (int)($p / $q)w PHP 5.

Colin D. Bennett
źródło
4

Możesz użyć skrótu, dodając na końcu | 0

8/3 | 0

Besi
źródło
3
-1; jest to mylące nadużycie operatora „bitowego lub”. Wprawdzie działa (ponieważ operandy do operatorów bitowych są rzutowane na liczby całkowite, które zaokrągla wartości zmiennoprzecinkowe w dół, a faktyczna operacja bitowa lub z 0 nie powoduje żadnych zmian w wynikowej wartości całkowitej), ale aby programista czytający ten kod zrozumieć, dlaczego to działa, muszą znać zarówno zachowanie rzutowania operatorów bitowych PHP (co jest niejasną wiedzą o ciekawostkach, których 99% programistów PHP nie będzie miało) oraz że bitowe lub z 0 pozostawia wartość niezmienioną (nie jest gwarantowana, ponieważ nie wszystkie twórcy stron internetowych rozumieją operacje bitowe).
Mark Amery,
1
@MarkAmery, fakt, że programiści MOS o tym nie wiedzą, nie oznacza, że ​​nie działa. I oczywiście to dobry powód do głosowania za, aby ludzie nauczyli się go używać.
Besi
2
tak, jest to zagmatwane, więc nie powinno być używane w kodzie produkcyjnym, ale nie zmienia to faktu, że jest to ciekawe rozwiązanie problemu
Tomasz Swider
@TomaszSwider niektórzy ludzie mogą również szukać najkrótszego rozwiązania (szczególnie w niektórych wyzwaniach kodu).
Besi
1
Jest to używane w JavaScript przez cały czas. Programiści powinni już być świadomi tej sztuczki ...
Alexis Wilke
3

DLA PHP 7 intdiv()funkcja try :

Składnia: int intdiv($dividend, $divisor)

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

W przypadku starszych wersji 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
źródło
Od sierpnia 2019 r. To jedyna poprawna odpowiedź.
DomQ