Teilen Sie eine Ganzzahl und erhalten Sie einen ganzzahligen Wert

84

Wenn ich in Sprachen wie C oder Python eine Ganzzahl durch eine Ganzzahl teile, erhalte ich eine Ganzzahl:

>>> 8/3
2

Aber wenn ich in PHP eine Ganzzahl durch eine andere Ganzzahl durch teile /, bekomme ich manchmal einen Gleitkommawert:

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

Ich würde gerne wie in Python oder C teilen, so dass 8/3 2 ist. Wie kann ich das in PHP machen?

Ismail Saleh
quelle
mögliche doppelte Fragen / 2055469
Nikson Kanti Paul
Wenn Sie das oben genannte abrunden, werden Sie bekommen 6, was brauchen Sie 5 oder 6?
Starx
1
@Starx: Es gibt mehr als einen Rundungstyp: en.wikipedia.org/wiki/Rounding#Tie-breaking . Also, wenn Sie 5.6 runden - Sie wissen nicht, was Sie bekommen (ohne anzugeben, wie Sie es runden möchten)
zerkms
1
@zerkms, ja in der Tat funktionieren wie ceil()und floor()sind die Funktionen, die anders aufrunden .
Starx

Antworten:

94

Verwenden Sie die round()Funktion, um einen ganzzahligen gerundeten Wert zu erhalten.

round(8 / 3); // 3

oder

Verwenden Sie die floor()Funktion, um einen ganzzahligen Wert abzurufen

floor(8 / 3); // 2
iLaYa ツ
quelle
10
Stimme nicht zu. Etage (-8 / 3) === -3.0, sollte aber -2 sein
ByScripts
14
Beachten Sie, dass floor()eine floatNICHT-Ganzzahl zurückgegeben wird, also erhalten Sie 2.0und nicht 2. Wirf das Ergebnis, um sicherzustellen, dass du eine ganze Zahl bekommst:(int)floor(8/3)
Jason
2
@ByScripts -8/3 = -3 ist für die Ganzzahldivision genauso gültig wie -8/3 = -2 . Ersteres ist "Kürzung in Richtung negativer Unendlichkeit", und letzteres ist "Kürzung in Richtung Null". Beide haben Vorteile und verschiedene Sprachen wählen unterschiedliche Verhaltensweisen. Zum Beispiel schneidet C gegen Null ab (wie auch PHP 7 intdiv), während Python gegen negative Unendlichkeit abschneidet.
Mark Amery
Beachten Sie, dass lid () immer aufgerundet wird.
Ales
71

In PHP 7 gibt es eine intdiv- Funktion, die genau das tut, was Sie wollen.

Verwendung:

intdiv(8, 3);

Rückgabe 2.

Marek Lisý
quelle
4
Das ist wirklich eine große Überraschung, dass diese Funktion nur mit PHP 7 eingeführt wird :) Na ja, besser spät als nie.
Eric Gopak
1
Gibt es eine Lösung wie diese in PHP 5.6
Usman Ali Maan
1
Nicht so einfach, nein. Verwenden Sie in PHP 5.6 die akzeptierte Antwort :)
Marek Lisý
22

In PHP gibt es keinen ganzzahligen Divisionsoperator. 1/2 ergibt den Float 0,5. Der Wert kann in eine Ganzzahl umgewandelt werden, um ihn nach unten zu runden, oder die Funktion round () bietet eine genauere Kontrolle über das Runden.


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

PhP Handbuch

SP
quelle
8

benutze das....

intval(1700000 / 300000 )...

Dies gibt den ganzzahligen Wert zurück.

Bipen
quelle
5
(int)(1700000 / 300000);

Verwenden Sie Typ Casting.

Mahipal Purohit
quelle
4
Aw! Nur weil (0.1 + 0.7) == 0.799999 ... statt 0.8 :) :) :)
Jesse Chisholm
3
@ luc.chante Das von Ihnen angegebene Beispiel ist auf einen Gleitkommafehler zurückzuführen. Der genaue Wert von (0.1 + 0.7) * 10ist 7.99999999999999911182158029987476766109466552734375. Es ist völlig richtig, dass eine (int)Umwandlung diesen Wert auf 7 abschneidet. Wenn Sie eine Ganzzahl durch eine andere Ganzzahl teilen, wie dies bei der Frage und Antwort hier der Fall ist, kann ein solcher Gleitkommafehler das Ergebnis nach dem Abschneiden nicht ändern.
Mark Amery
Dies reproduziert das genaue Verhalten, das in C / C ++ erwartet wird, wenn eine Ganzzahldivision durchgeführt wird, sodass ich überhaupt kein Problem sehe.
Alexis Wilke
5

Es gibt verschiedene Möglichkeiten, eine Ganzzahldivision in PHP durchzuführen. Die Sprache hat keinen Operator für die Ganzzahldivision, aber es gibt verschiedene Möglichkeiten, den Gleitkommaquotienten auf eine Ganzzahl zu runden:

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

Unter PHP 7 können Sie intdiv($p, $q)die Ganzzahldivision direkt durchführen. Dies entspricht (int)($p / $q)PHP 5.

Colin D Bennett
quelle
4

Sie können die Kurzform verwenden, indem Sie am Ende | 0 hinzufügen

8/3 | 0

Besi
quelle
3
-1; Dies ist ein verwirrender Missbrauch des Operators "bitwise or". Zugegeben, es funktioniert (da Operanden zu bitweisen Operatoren in Ganzzahlen umgewandelt werden, wodurch Gleitkommawerte abgerundet werden und die tatsächliche Operation von bitweise oder mit 0 keine Änderung des resultierenden Ganzzahlwerts bewirkt), aber damit ein Entwickler diesen Code liest Um zu verstehen, warum es funktioniert, müssen sie sowohl das Casting-Verhalten der bitweisen PHP-Operatoren kennen (was 99% der PHP-Entwickler nicht wissen) als auch, dass ein bitweises oder mit 0 einen Wert unverändert lässt (nicht garantiert, da nicht alle Webentwickler verstehen Bitoperationen).
Mark Amery
1
@ MarkAmery, die Tatsache, dass Mos-Entwickler nichts davon wissen, bedeutet nicht, dass es nicht funktioniert. Und das ist natürlich ein guter Grund, sich zu verbessern, damit die Leute lernen, wie man es benutzt.
Besi
2
Ja, es ist verwirrend, sollte also nicht im Produktionscode verwendet werden, aber es ändert nichts an der Tatsache, dass es eine interessante Lösung für das Problem ist
Tomasz Swider
@TomaszSwider Einige Leute suchen möglicherweise auch nach der kürzesten Lösung (insbesondere bei einigen Code-Herausforderungen).
Besi
1
Dies wird ständig in JavaScript verwendet. Programmierer sollten sich dieses Tricks inzwischen bewusst sein ...
Alexis Wilke
3

Für PHP 7 versuchen Sie intdiv()Funktion:

Syntax: int intdiv($dividend, $divisor)

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

Für ältere Versionen von 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
quelle
Ab August 2019 ist dies die einzig richtige Antwort.
DomQ
0

Für PHP Version 7 => intdiv(a,b)

Und für Versionen unter 7 (wie 5.6) => (int)floor(abs(a/b))

sanjay.chouhan180
quelle
Funktioniert nicht für große Ganzzahlen. Siehe stackoverflow.com/questions/54606140
Wiimm