dedlfix: komisches Problem

Beitrag lesen

echo $begrüßung;

Ich habe auch mit der echo funktion überpruft ob der fehler vielleicht bei der mod funktion liegen könnte, die giebt aber bei 94: 1 aus.

Sehr schön, dass du Kontrollausgaben vornimmst, um den Fehler zu finden. Neben echo (was übrigens keine Funktion ist) gibt es auch noch var_dump() (das ist allerdings eine Funktion), die neben dem Wert auch noch den Typ einer Variable ausgibt.

wenn man in num2let die nummer 93 eingibt, wird "." ausgegeben. Dasselbe geshiet wenn man 94 eingibt. Jedoch wird bei der eingabe von 0 "." und von 1 "#" ausgegeben.

Ich füge mal ein paar Kontrollausgaben ein:

function num2let($a) {  
echo "\nEingabe:  $a\n";  
  $string=".#'!1234567890qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM,;:_(){}=+*/:-<>?;$\"\\";  
  $a = mod($a, strlen($string));  
  
var_dump($a); // Ergebnis von mod()  
var_dump((int)$a); // Typecast nach Integer  
var_dump((int)round($a)); // Rundung und Typecast  
  
  return $string{$a};  
}  
  
// function mod() {...} weggelassen  
  
num2let(0);  
num2let(1);  
num2let(2);  
num2let(93);  
num2let(94);  
num2let(95);  

Das Ergebnis (PHP 5.1.2) ist wie folgt:

Eingabe:  0
float(0)  Ergebnis von mod()
int(0)    Typecast nach Integer
int(0)    Rundung und Typecast

Eingabe:  1
float(1)
int(1)
int(1)

Eingabe:  2
float(2)
int(2)
int(2)

Eingabe:  93
float(0)
int(0)
int(0)

Eingabe:  94
float(1)
int(0)
int(1)

Eingabe:  95
float(2)
int(1)
int(2)

Wie bei 94 und 95 zu sehen ist, gibt es hier anscheinend ein Ungenauigkeitsproblem beim Umwandeln von float-Werten[*]. Trotz des bei 94 eindeutig aussehenden "float(1)" ergibt der Typecast ein int(0). Vielleicht ist das ja gar kein 1 sondern ein 0,999999999... und var_dump() rundet hier, der Typecast aber nicht ... jedenfalls bringt uns Spekulieren hier nicht weiter. Ein explizites Runden mit floor() schafft hier offensichtlich ein "besseres" float(1).

Meine erste frage bezieht sich nicht wirklich auf mein Hauptproblem. Gibt es in Php eine modolu funkton, weil ich persönlich konnte keine finden.

Mit dem Modulo-Operator %, welcher einen Integer-Wert zurückgibt, gibt es das Problem nicht.

echo "$verabschiedung $name";

[*] Dieses Float-Problem ist kein unbekanntes. Nicht alle Zahlen lassen sich in jedem Zahlensystem mit einer endlichen Anzahl Stellen darstellen. Z.B. 1/3 im Dezimalsystem: 0,3333333usw. Da jedoch der Speicherplatz begrenzt ist, läuft der Kompromiss auf Ungenauigkeiten heraus.