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?


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

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.


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


8

Użyj tego....

intval(1700000 / 300000 )...

zwraca wartość całkowitą.


5
(int)(1700000 / 300000);

użyj rzutowania typów.


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.


4

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

8/3 | 0


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

Od sierpnia 2019 r. To jedyna poprawna odpowiedź.
DomQ

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.