intval( (1.2 - intval(1.2) ) * 100) ergibt 19 ?!?!?!?

Alles, was PHP betrifft, kann hier besprochen werden.

intval( (1.2 - intval(1.2) ) * 100) ergibt 19 ?!?!?!?

Postby phbock » 04. October 2006 18:11

Hallo,

Ich hab da ein ganz blödes Problem mit einem php script. Durch Zufall entdeckt, aber mit für mich potentiell verheerenden Folgen. Die Formal:

intval( ($correct - intval($correct) ) * 100)

ergibt bei $correct = 1.3 richtigerweise 30
aber bei $correct = 1.2 seltsamerweise 19 (!!!)
Ich habe einige andere Werte probiert, aber immer korrekt, ausser eben bei diesem 1.2.

Ist das ein bekannter Bug? Irgendwelche Ideen?

Vielen Dank
Phillip
PHP Version 4.4.1-pl1
phbock
 
Posts: 7
Joined: 04. October 2006 17:57

Postby Wiedmann » 04. October 2006 18:30

Auf die Präzision und vor allem interne Darstellung von Gleitkommazahlen sollte man sich nie verlassen.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby phbock » 04. October 2006 19:37

Ja, das hab ich auch auf dem Zettel, aber ich dachte wir reden hier vonPräzision an der x.ten Stelle hinter dem Komma und nicht bei 1.2 :(

Wie lös ich das denn? Nutzereingaben in Integer verwandeln (mit 10hochAnzahlErlaubteNachkommaStellen multiplizieren) und sich elegant irgendwo den Faktor merken?

Oder gibt's da bessere Möglichkeiten?

Danke
Phillip
phbock
 
Posts: 7
Joined: 04. October 2006 17:57

Postby Wiedmann » 04. October 2006 20:35

Das dem so ist, kannst du z.B. hier nachlesen:
http://de.php.net/manual/en/language.ty ... -precision

Da steht auch, was man alterativ benutzen kann.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby phbock » 05. October 2006 06:39

Danke, das klärt einiges, auch wenn ich entsetzt bin, dass diese Fehler bereits eine Stellt nach dem Komma auftreten. Wie auch immer, jetzt weiss ich, dass das nicht als Bug eingestuft wird, sondern die Welt damit zufrieden ist :D

Naja, muss ich mir was ausdenken. Macht die Sache komplizierter...

tschuess
Phillip
phbock
 
Posts: 7
Joined: 04. October 2006 17:57

Postby phbock » 05. October 2006 06:50

Ahh, noch einen habe ich zu dem Thema. Habe jetzt meine Lösung gefunden:

Also der Schritt:

(1.2 - intval(1.2) ) * 100

ergibt noch 20 (korrekterweise)

aber:

intval ( (1.2 - intval(1.2) ) * 100 )
ergibt dann 19 (also intval(20) = 19)

Ich denke, dass hier nicht wirklich 20 stand, sondern eben 19.9999999 oder so. Was ich jetzt also mache ist:

intval (( $variable - intval($variable) * 100 + 0.00000001), und bisher klappt das gut.

Also Danke nochmal
Phillip
phbock
 
Posts: 7
Joined: 04. October 2006 17:57

Postby Wiedmann » 05. October 2006 08:55

Zwecks der Vollständigkeit:
Code: Select all
$correct = 1.2;
echo round(($correct - (int) $correct) * 100);
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby phbock » 05. October 2006 17:49

Auch ne Möglichkeit:-)

Danke
Tschüss
Phillip
phbock
 
Posts: 7
Joined: 04. October 2006 17:57

Postby sari42 » 06. October 2006 19:13

phbock wrote:Auch ne Möglichkeit:-)

aber eleganter ;)
sari42
 
Posts: 800
Joined: 27. November 2005 18:28


Return to PHP

Who is online

Users browsing this forum: No registered users and 14 guests