PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   intval 'berechnet' falsch !!! (http://www.selfphp.de/forum/showthread.php?t=18147)

Webbing 29.11.2007 13:35:46

intval 'berechnet' falsch !!!
 
Hallo,

leider weiß ich nicht mehr weiter.

Bei der 'Umwandlung' einer Zahl in einen Integer ist manchmal das Ergebnis um '1' zu klein.

PHP-Code:

for($i 511.84$i 511.88$i += .01) {
    echo(
$i.' - '.($i*100).' - '.(doubleval($i)*100).' - '.(intval(doubleval($i)*100)).'<br>');


Das ergibt die Ausgabe:

511.84 - 51184 - 51184 - 51184
511.85 - 51185 - 51185 - 51185
511.86 - 51186 - 51186 - 51185
511.87 - 51187 - 51187 - 51186
511.88 - 51188 - 51188 - 51187


Warum inkrementiert intval ab 51186 ?

Die Berechnung 'intval(doubleval($i)*100)' benutze ich in einem Web und habe hier zum Testen nur mal eine Schleifen darum gesetzt.

Entferne ich doubleval, so ist der Fehler immer noch drin.
Entferne ich intval, so werden die Zahlen korrekt angezeigt.


Viele Grüße
Frank

feuervogel 29.11.2007 14:02:33

AW: intval 'berechnet' falsch !!!
 
der fehler passiert schon vorher:
PHP-Code:

<?php
for($i 400.84$i 400.88$i $i 0.01) {
    echo 
$i;
    echo 
"<br>";
}  

?> 
<br>
<?php
for($i 4$i 8$i $i 1) {
    echo 
$i;
    echo 
"<br>";
}  

?>

eigentlich dürfte die 400.88 gar nicht mfehr da stehen (im unteren beispiel ists korrekt).

warum ist mir allerdings ein rätsel...

Webbing 29.11.2007 14:17:59

AW: intval 'berechnet' falsch !!!
 
Zitat:

Zitat von feuervogel (Beitrag 109300)
eigentlich dürfte die 400.88 gar nicht mfehr da stehen (im unteren beispiel ists korrekt).

Stimmt, das ist mir noch gar nicht aufgefallen.

Allerding hat es mit meinem Problem nichts zu tun.
Wie du an den Zahlenkolonnen siehst, wird erst nach dem intval die Zahl geändert.

Trotzdem vielen Dank für deinen Beitrag. Scheinbar hat PHP an mehreren Stellen Probleme mit Kommazahlen.

Vielleicht kann uns ja jemand sagen, wo das eventuell bereits dokumentiert ist und ob man diese Fehler irgendwie umgehen kann.

Viele Grüße
Frank

defabricator 29.11.2007 14:19:39

AW: intval 'berechnet' falsch !!!
 
http://de2.php.net/manual/de/language.types.float.php
Zitat:

Warnung
Fließkomma Präzision

Webbing 29.11.2007 14:35:39

AW: intval 'berechnet' falsch !!!
 
Danke defabricator,

scheinbar sollte ich einfach das intval entfernen und darauf vertrauen, dass das doubleval richtig funktioniert. Dann stimmt nämlich auch das Endergebnis.

Viele Grüße
Frank

feuervogel 29.11.2007 15:23:21

AW: intval 'berechnet' falsch !!!
 
Zitat:

Das gründet sich auf die Tatsache, dass es unmöglich ist, manche Dezimal-Zahlen durch eine endliche Anzahl an Nachkomma-Stellen darzustellen. Dem Wert 1/3 entspricht z.B. der interne Wert von 0.3333333. . ..
Manche Dezimalzahlen lassen sich also nicht durch eine endliche Zahlenfolge darstellen und daher verrechnet sich PHP bei

floor((0.1 + 0.7) * 10)

Wie passt das nun aber zusammen? In dem fehlerhaften Beispiel kommt keine Zahl vor, bei der es bei der Dezimaldarstellung Probleme geben sollte, oder???

meikel (†) 29.11.2007 20:06:38

AW: intval 'berechnet' falsch !!!
 
Zitat:

Zitat von feuervogel (Beitrag 109312)
In dem fehlerhaften Beispiel kommt keine Zahl vor, bei der es bei der Dezimaldarstellung Probleme geben sollte, oder???

PHP rechnet aber nicht mit Dezimalzahlen. Bei der Umrechnung dezimaler Zahlen ins Float Format können unendliche binäre Brüche entstehen...

defabricator 29.11.2007 20:13:36

AW: intval 'berechnet' falsch !!!
 
Naja, die deutsche Übersetzung ist mal wieder etwas unpräzise.
Zitat:

This is related to the fact that it is impossible to exactly express some fractions in decimal notation with a finite number of digits. For instance, 1/3 in decimal form becomes 0.3333333. . ..
Das Problem liegt in der Binärdarstellung der Fießkommazahl.
Weder 511.85 noch 511.86 lassen sich glatt als binäre Fließkommazahl darstellen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:18:28 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.