komisches if Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • komisches if Problem

    Hallo,

    ich stehe hier vor einem sehr komischen Problem. Ich vergleiche zu Anfang eines Scripts zwei Werte:

    $amount = (float) $amount;
    if($amount != $completePrice) {
    die("fehler");
    }

    $amount bekomme ich über die URL, $completePrice wird in einer Session gespeichert. Obwohl beide Werte gleich sind (zahlen), wird der Inhalt der If Abfrage ausgeführt, also das die(). Ich verstehe es nicht. Von der Logik her sollte es weiter gehen.
    Das komische ist, das es bei einigen Zahlen wie z.B. 5370 tut, bei anderen wie z.B. 7360 nicht. Beide Zahlen sind IMMER identisch.

    EDIT:
    es wird skuriler. Ich habe jetzt folgendes gemacht:
    Wert completePrice = 7360 (double).

    $completePrice = (int) $completePrice;

    Wert completePrice danach = 7359
    Wieso bekomme ich jetzt diesen Wert? Ist doch unlogisch.
    Bei 5370 hingegen bekomme ich auch 5370.

    PHP Version 5.3.18-nmm1 (gibts evtl. einen Bug in der Version?)
    Zuletzt geändert von joextra; 29.04.2013, 12:01.
    Erfahrungen vererben sich nicht jeder muss sie allein machen.

  • #2
    Ich kenne dieses Verhalten nur von Werten mit Nachkommastellen, da hing es mit dem zusammen, was da unter Warnung angegeben ist:

    PHP: Fliekommazahlen - Manual

    Kommentar


    • #3
      Hi,

      zeig mal deinen ganzen relevanten Code.

      mfg streuner
      Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
      der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

      "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

      Kommentar


      • #4
        Im Prinzip ist $completePrice ein float (im obringen Bsp. ist der Wert 73,6). Diesen multipliziere ich x100 (da der Wert den ich zum überprüfen bekomme auch x100 ist). Wenn ich dann aus $completePrice (den mit 100 multiplizierten) ein INT mache, bekomme ich dann nicht 7360 sondern 7359 zurück.

        @streuner
        wie schon geschrieben, ist das der Anfang der Codes.
        Erfahrungen vererben sich nicht jeder muss sie allein machen.

        Kommentar


        • #5
          sämtliche Warnhinweise in Bezug auf die Benutzung mal gelesen?

          PHP: Integers - Manual

          mfg streuner
          Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
          der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

          "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

          Kommentar


          • #6
            ich habs gelesen, hat mich aber auch nicht weiter gebracht (oder übersehe ich etwas?).

            Ich bin jetzt mal den umgekehrten Weg gegangen und habe $amount in float umgewandelt. Komischer weise funktioniert der vergleich mit 73,6 aber nicht mehr 53,7 (ist jetzt also genau umgekehrt).

            EDIT:
            ich habs jetzt anders gemacht. Ich wandle $completePrice nicht mehr in INT, sondern mache daraus einen String. Ich weiß, ist nicht gerade elegant, aber es funktioniert.
            Zuletzt geändert von joextra; 29.04.2013, 15:24.
            Erfahrungen vererben sich nicht jeder muss sie allein machen.

            Kommentar


            • #7
              Gut, das ist eine Ungenauigkeit durch Typumwandlung. Doch warum nimmst Du nicht einfach eine mathematische Funktion für beliebige Genauigkeit, wenn da schon in den Warnungen auf die Verwendung mathematischer Funktionen hingewiesen wird?

              PHP-Code:
              /* -- ohne und mit mathematischer Funktion -- */

              $completePrice1 73.6 *100;
              $completePrice2 = (int) $completePrice1;
              $completePrice3 = (int) bcmul(10073.6);  // Multiplikation mit 100

              echo "Type: ".gettype($completePrice1)." Wert: ".$completePrice1."<br>\n";
              echo 
              "Type: ".gettype($completePrice2)." Wert: ".$completePrice2."<br>\n";
              echo 
              "Type: ".gettype($completePrice3)." Wert: ".$completePrice3."<br>\n";

              /*
              Type: double Wert: 7360
              Type: integer Wert: 7359
              Type: integer Wert: 7360
              */

              /* -- mit mathematischer BC Funktion -- */

              $amount 7360;
              $completePrice = (int) bcmul(10073.6);  // Multiplikation mit 100

              if($amount !== $completePrice) {

                  echo 
              "Fehler:<br>\n".
                       
              "Type: ".gettype($amount)." Wert: ".$amount."<br>\n".
                       
              "Type: ".gettype($completePrice)." Wert: ".$completePrice."<br>\n";
              }
              else {
                  echo 
              "Kein Fehler:<br>\n".
                       
              "Type: ".gettype($amount)." Wert: ".$amount."<br>\n".
                       
              "Type: ".gettype($completePrice)." Wert: ".$completePrice."<br>\n";
              }
              /*
              Kein Fehler:
              Type: integer Wert: 7360
              Type: integer Wert: 7360
              */ 
              Zuletzt geändert von Melewo; 29.04.2013, 17:42.

              Kommentar


              • #8
                danke, an bcmul hatte ich nicht gedacht
                Erfahrungen vererben sich nicht jeder muss sie allein machen.

                Kommentar

                Lädt...
                X