PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zahlen vergleichen will net so wie ich will...


Eichbjörnchen
07.10.2005, 11:20:23
Hallo, hab mal wieder ein Problem und möchte wieder darauf hinweisen, dass ich immer noch Anfänger bin :-)
Erst mal mein Skript:
<?
if (isset($_POST['name'])) {
if ($_POST['name']!="" AND $_POST['datum']!="" AND $_POST['uhrzeit_s']!=""
AND $_POST['dauer']!="" AND $_POST['thema']!="") {
$datum = $_POST['datum'];
$name = $_POST['name'];
$uhrzeit_s =$_POST['uhrzeit_s'].":00";
$dauer =$_POST['dauer'];
$punkt_tester = strpos ($dauer, ".");
if ($punkt_tester === false) {
$dauer = str_replace(",", ".", $dauer);
}
$dauer_speicher = $dauer;
for (; $dauer>0; $dauer--) {
if ($dauer<1 AND $dauer!=0) {
echo "Es ist nicht eine ganze Zahl<br>Rest: $dauer - <blink>$dauer_speicher</blink><br>";
for ($asd=1; $asd<100; $asd++) {
echo "$dauer - ".($asd/100)."<br>";
if ($dauer==($asd/100)) {
$dauer_min=(60*$dauer);
echo "Der Rest ist ".($asd/100)." h, das sind $dauer_min min<br>";
}
}

}
else {
echo "$dauer<br>";
}
} ...
jetz hab ich folgendes Problem. Wenn ich in einer Maske meine Daten für Dauer eingebe macht er nicht wirklich das, was ich will.
Wenn ich Dauer = 2.0 eingebe, macht er das Richtige
Wenn ich Dauer = 2.25, 2.5 oder 2.75 eingebe, dann klappt auch der Vergleich.
Aber wenn ich Dauer = z.B. 2.8, 5.7, 1.11 eingebe, dann klappt der Vergleich von $dauer und $asd/100 net. Wenn ich aber anstatt 1.11 0.11 eingebe (für alle 0.xx), dann klappt es. Ich steige aber net dahinter, warum 2.11 -1 -1 =0.11 anders sein soll, als wenn ich direkt 0.11 eingebe. Hä? Hilfe...
Ich weiß, es ist umständlich geschrieben, aber wie gesagt, ich bin Anfänger. Es muss später in der DB auch Startzeit, Endzeit und Dauer drinnen stehen. Aber das klappt. Nur nicht dieser Vergleich.
Danke schon mal und ich hoffe ihr kommt durch meinen Text einigermaßen durch :-)
Björn

meikel (†)
07.10.2005, 17:20:17
> Ich steige aber net dahinter, warum 2.11 -1 -1 =0.11 anders sein soll, als wenn ich direkt 0.11 eingebe. Hä? Hilfe...

Intern konvertiert PHP die Zahlen vom Dezimalsysten ins Binärsystem. Problematisch sind dabei die Werte nach dem Komma, weil es dabei bisweilen zu unendlichen Binärbrüchen kommt (ZB. bei 0.2). Das ist bei fast allen Programmiersprachen so, wenn die keine Dezimalarithmetik verwenden.

Wenn Du mit float Zahlen rechnest, mußt Du bei Vergleichen zwingend vorher auf die relevante Anzahl an Nachkommastellen runden.
Sonst wäre zB.
print (0.2 == (1 - 0.2 - 0.2 - 0.2 - 0.2) ) ? 'gleich' : 'ungleich';
immer falsch.