Mailinglisten-Archive |
Norbert Pfeiffer schrieb:
> Hallo,
>
> damit niemand uebers WE einrostet:
>
> In einem Script wird eine(1) csv-Datei eingelesen und verarbeitet.
> Dabei wurden einige Datensaetze nie richtig beruecksichtigt.
> Also habe ich ein zweites "elseif" eingefuegt,
> und siehe da, es klappt - nur warum ... <gruebel>
>
>
> <?
> function umform($zahl) {
> return doubleval(str_replace(',','.',$zahl));
> }
>
> /* Hier werden Werte erzeugt */
> $sm19 = 0 + umform($BB[19]);
> $summ = 0 + umform($BB[20]) + umform($BB[21]);
>
> /* und hier dann verglichen */
> } elseif ($sm19 == $summ) {
> $TT[$i] .= ' / Berechnung A';
> } elseif ("$sm19" == "$summ") {
>
> $TT[$i] .= ' / Berechnung B';
> }
> ?>
>
Mal ins Blaue:
Kann es sein, dass im Rahmen von internen Typkonvertierungen da ein
Rundungsfehler Einzug gehalten hat? Oder ein Rundungsfehler beim '==' sich
einschleicht?
Schau mal hier:
http://de3.php.net/manual/de/language.types.float.php#warn.float-precision
<snip>
Fließkomma Präzision
Es ist ziemlich normal, dass einfache Dezimalzahlen wie 0.1 oder 0.7 nicht
in ihre internen binären Entsprechungen konvertiert werden können, ohne
einen kleinen Teil ihrer Genauigkeit zu verlieren. Das kann zu verwirrenden
Ergebnissen führen. So wird floor((0.1 + 0.7) * 10) normalerweise 7 statt
des erwarteten Wertes 8 zurück geben (als Ergebnis der internen
Entsprechung von 7.9999999999...).
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.
. ..
Deshalb sollten Sie nie den Ergebnissen von Fließkomma-Operationen bis auf
die letzte Nachkomma-Stelle trauen und nie solche auf Gleichheit prüfen.
Benötigen Sie wirklich eine größere Genauigkeit, sollten sie die
mathematischen Funktionen beliebiger Genauigkeit oder die Gmp Funktionen
benutzen.
</snip>
Und genau das machst du mit deinem Vergleich aber.
Und im zweiten 'elseif' machst du ja de facto eine Typenvereinheitlichung
auf 'STRING' und vergleichst die dann. Und einem String ist es relativ egal,
wie lang die Zahl ist....
Hast du mal einen Auszug aus deiner CSV-Datei, damit wir wissen, um was für
Daten es sich handelt?
Oder gib doch im 2. 'elseif' mal aus, was für Werte du da vergleichst. Oder
lass dir vor dem Vergelich mal einen Var_dum ausgeben von den beiden
Vergleichszahlen.
Vielleicht solltest du auch einfach nach FLOAT konvertieren und nicht nach
DOBLE?
HTH
Grüße
Andreas
--
wdv Medien & Kommunikation GmbH & Co. OHG
Mediendatenverarbeitung
Andreas Heigl
Siemensstrasse 6
61352 Bad Homburg
Germany
Telefon +49-(0)6172-670-185
Telefax +49-(0)6172-670-181
www.wdv.de
php::bar PHP Wiki - Listenarchive