Frage von Felix193, 103

[PHP] Wie kann ich den Error "Division by zero" bei einer Prozentrechnung beheben?

Hallo,

Ich möchte in PHP eine Prozentrechnung berechnen, dabei nutze ich die Formel a/b*100. Daher ist standardmäßig a<b, damit ist der Quotient eine Rationale Zahl. Jetzt bekomme ich aber leider den Error "Division by zero", dabei teile ich gar nicht durch 0:

 $online = $info[5] / $info[6] * 100;

Der Term sollte eigentlich richtig sein. Was mache ich falsch gemacht?

Vielen Dank.

Antwort
von triopasi, 33

Geb die Variablen doch mal aus. Wenn der Wert nicht 0 wäre würdest du keinen Fehler erhalten.

Antwort
von gumpo03, 79

Dein $info[6] scheint 0 zu sein, eine Division durch 0 ist nicht möglich, daher der Fehler.

Beheben könntest du es beispielsweise indem du du folgenden Code vor der Zeile einbaust:

if $info[6] == 0 { $info[6] = 1; }

PS: Dann verfälschst du den Wert aber natürlich. Besser ist also:

if $info[6] == 0 { $online = 0; } else { $online = $info[5] / $info[6] * 100; }
Kommentar von Felix193 ,

Danke für die Antwort! So müsstes eigentlich sein:

if($info[6] == 0){ $info[6] = 1; }

Es ist aber blöd, dass $info[6] 0 ist, es sollte eigentlich 4 sein und es ist nicht so gut, wenn ich es einfach auf eins setze. Gibt's noch eine andere Fehlerquelle?

Kommentar von Robinson97 ,

Wie befüllst du dein Array ?

Kommentar von gumpo03 ,

Oh, ja ^^

Ein kleiner Tipp den ich auch anwende wenn ich so ein Problem habe:

Gib zur Fehlerfindung doch einfach ein paar mal die Variablen aus, so erkennst du vielleicht wo der Fehler entsteht und kannst ihn so einfacher beheben :)

Antwort
von Robinson97, 67

Probier es mal so:

if($info[5] == 0 || $info[6]==0)

{

echo "Division durch null";

}

else {

$erg = ($info[5] /  $info[6] )*100;


}

Dann fängst du den ERROR schon mal ab ! Dein Fehler liegt warscheinlich darin, dass deine Arrays falsch befüllt wurden oder zumindest eines der beiden...

Kommentar von Felix193 ,

Vielen Dank für die Antwort. Über die Methode von gumpo03 fange ich den Error ab. Jetzt ist das Problem, dass der Wert nie 0 ist. Momentan müsste er 4 sein. Wie bekomme ich es behoben, dass dieser 4 ist? Und $info[5] ist ebenfalls 1, trotzdem kommt 0 raus...

Kommentar von Robinson97 ,

Wie befüllst du dein Array bzw. könntest du den Quellcode bitte reinstellen ?

Kleiner Tipp, lass dir zu testzwecken einfach den Wert des Arrays ausgeben ausgeben...

Kommentar von Felix193 ,

Hier der Code:

<?php
require('SimpleMinecraftQuery.php');
$info = SimpleMinecraftQuery::query("127.0.0.1", 25565);?>
<?php
if($info[6] == 0){
$info[6] = 4;
}
$online = $info[5] / $info[6] * 100;?>

SimpleMinecraftQuery.php (habe ich nicht selbst geschreiben):

<?php
/* Minecraft Query Class
* @author prog266
* @license GPLv3
*/
class SimpleMinecraftQuery {

private $socket;
private $handle;
public $info;

public function query($hostname, $port) {
$socket = @fsockopen("tcp://" . $hostname, $port, $errno, $errstr, 5);

if(!($socket)) {
return false;
}

fwrite($socket, "\xFE");
$handle = fread($socket, 80000000);
$handle = substr($handle, 2);
$info = explode("\xA7", $handle);
return $info;
}
}
?>
Kommentar von EightSix ,

Wir wissen ja nicht wie du an die Werte kommst. Wie sollen wir dann wissen wieso die Variable nicht den Wert 4 hat?

Kommentar von Felix193 ,

Der Code steht über dir... Ich musste kurz nachgucken, ob ich den Code von der "SimpleMinecraftQuery.php" veröffentlichen durfte. Ist mir durch die GPL erlaubt... ;)

Kommentar von Robinson97 ,

Ok, ich weiß nicht was in die Variable $info eingespeichert wird :), lass sie dir vor deiner Rechnung ausgeben und überprüfe für dich ersteinmal den Wert an der Stelle [5] bzw. mach eine Ausgabe

Kommentar von Felix193 ,

$info[1-4] Strings, $info[5] ist momentan 1 und $info[6] momentan 4

Kommentar von Robinson97 ,

Du weißt, dass ein Array ab der Stelle 0 anfängt oder ?

Vielleicht liegt hier der Fehler ???:)

Kommentar von Felix193 ,

nein, habe mich auch vertippt... Die Arrays 1-5 sind Strings, in denen werden einzelne Wörter abgespeichert

Kommentar von Felix193 ,

Quatsch *0-4

Kommentar von Robinson97 ,

Du gehst also davon aus, dass die Arrays auf JEDEN Fall richtig befüllt sind. Vielleicht bekommst du keinen int oder double übergeben, sondern einen String. Versuch mal folgendes:

$ergebnis=((double)$info[2]+(double)$info[4]);

Antwort
von fragenbuch, 58

Du musst prüfen, ob $info[5] und$ info[6] nicht 0 sind

if($info[5] !== 0 && $info[6] !== 0){
$online = $info[5] / $info[6] * 100;
} else {
$online = 0;
}
Kommentar von Felix193 ,

Danke erstmal für die Lösung, um den Error abzufangen. Leider ist das aber immernoch nicht das Ziel.

an anderen Stellen sind $info[5] und $info[6] Werte >0, aber bei der Prozentrechnung nicht. Woran kann es liegen?

Kommentar von fragenbuch ,

Zeige mal den kompletten Code, damit man das besser nachvollziehen kann.

Kommentar von Felix193 ,

Der Code steht unter der Antwort von Robinson97

Kommentar von maximilianus7 ,

$info[5] darf durchaus 0 sein. in der grundschule nicht aufgepasst?

Kommentar von Felix193 ,

Das stimmt. Der Dividend kann/darf 0 sein. Ich persönlich überprüfe auch nur, ob $info[6] 0 ist, da ja $info[5] 0 sein darf.

Keine passende Antwort gefunden?

Fragen Sie die Community