rundet php falsch?

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

  • rundet php falsch?

    Hab soeben folgendes Problem festgestellt:

    Bei
    PHP-Code:
    round(17.0252); 
    erhalte ich als Ergebnis 17.02.

    Das Problem tritt immer auf, wenn ich .025 runde.

    Ist das normal? Habs getestet mit PHP Version 4.3.10 und 5.0.4

    Excel rundet auch auf 17,03 und ich konnte trotz intensiver Recherche nix finden, was besagt, das man bei .025 abrundet. Oder ist das kaufmännisch irgendwie anders? Aber wenns sogar Excel aufrundet...?

    Wäre schön besch...hab eine komplette Rechnungslegung programmiert und 1000 Mal round verwendet, wenn ich das jetzt alles ändern kann....na danke!

    Bug oder hab ich was übersehen?

  • #2
    http://boonedocks.net/mike/archives/...g-for-PHP.html


    okay, der Link hatte relativ wenig Sinn Oo,
    hm ... aber komisch ist es schon, eine 1 noch hinter und er rundet wieder auf *weitersuch*

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      oh...

      PHP-Code:
      <?php

      echo round (17.0202) . "\n"// 17.02
      echo round (17.0252) . "\n"// 17.02
      echo round (17.0262) . "\n"// 17.03

      echo "\n";

      echo 
      round (17.0302) . "\n"// 17.03
      echo round (17.0352) . "\n"// 17.04
      echo round (17.0362) . "\n"// 17.04
      ich würds mal bei einer der MailingListen probieren ... richtig ist das wohl eher nicht ^^;;;
      http://www.php.net/mailing-lists.php

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Ja, die Ergebnisse hatte ich ebenfalls!

        Sch.... drauf, ich schreib mir eine eigene Rundungsfunktion.

        Offensichtlich wirklich ein Bug in der round Funktion

        Danke, lG
        Bernie

        Kommentar


        • #5
          also, offensichtlich ist das weniger ein Bug in PHP, als ein genereller "Bug" mit Float-Werten. In php ist eine 0.5 nicht als 0.5, sondern als Zahl mit unendlicher vieler Stellen deklariert, dabei kann es passieren, dass die Zahl mal als 0.44444444444498 dargestellt, machmal als 0.5000000000002, sodass es halt manchmal ab oder aufrundet. Auf eine 0.5-Genauigkeit zu setzen ist somit dumm.

          Siehe:
          http://bugs.php.net/bug.php?id=984

          Warum da für "kleine" Zahlen kein Bugfix gemacht wird ...

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Dezimalbrüche lassen sich im Binärsystem nun mal nicht immer exakt abbilden.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Original geschrieben von wahsaga
              Dezimalbrüche lassen sich im Binärsystem nun mal nicht immer exakt abbilden.
              tjo, Strings verwenden ... wir haben in der Schule mal einen Addierer für beliebige Zahlen mit einem Listen-ADT realisiert, keine Ahnung wie schnell das ist/war, aber funktionieren tat es auf jeden Fall ^^

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Stimmt schon, dass das vielleicht kein direkter Bug ist, aber trotzdem für mich als Bug zu werten, weil dadurch die round Funktion unbrauchbar wird z.B. für kaufmännisches Runden.

                Auch Excel arbeitet mit Float Werten und da passiert sowas nicht...

                Am Einfachsten (wobei sicher nicht am Performantesten) wirds so zu lösen sein:
                PHP-Code:
                function round_kaufm($zahl) {
                 
                $ergebnis = (round($zahl 0.01) * 0.01); 
                 return 
                $ergebnis;

                Es gibt auf der PHP Seite zwar auch andere, schnellere Alternativen, aber die zu testen, fehlt mir die Zeit.

                lG
                Bernie

                Kommentar


                • #9
                  Original geschrieben von deltacon
                  PHP-Code:
                  function round_kaufm($zahl) {
                   
                  $ergebnis = (round($zahl 0.01) * 0.01); 
                   return 
                  $ergebnis;

                  DIVISION löst doch dein Problem nicht ?!
                  Du willst subtrahieren, mit round's 2.Parameter an Nullen nach dem Komma! ... ansonsten hat das ganze doch gar keinen Sinn,

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Probiers nur aus!

                    Ich dividiere ja durch 0,01, das ist äquivalent zu multiplizieren mit 100.

                    Also, Beispiel: 17,025 / 0,01 gibt 1702,5

                    round(1702,5) liefert 1703 (da brauch ich den Parameter für die Kommastellen nicht!)

                    Das Ganze Mal 0,01 -> 17,03 - Voilà

                    Noch Fragen?

                    Kommentar


                    • #11
                      War wohl etwas zu voreilig, die Funktion liefert genauso Inkonsistenzen bei der Berechnung.

                      Sch...
                      Zuletzt geändert von deltacon; 31.05.2006, 21:24.

                      Kommentar


                      • #12
                        So, so sollte es nun funktionieren, es ist wichtig, dass kein Komma, sondern ein Punkt in der Zahl steht, die gerundet wird, fragt nicht wieso, aber so funktionierts...hat Jemand eine Erklärung?
                        PHP-Code:
                        // Funktion zum Umwandeln von Kommas in Punkte
                        function format_number_db($text) {
                          
                        $text str_replace(",""."$text);
                          return 
                        $text;
                        }

                        // Funktion zum Runden
                        function round_kaufm($zahl$nix=0) {
                            
                        $zahl *= 100;
                            
                        $zahl round(format_number_db($zahl));
                            
                        $zahl /= 100;
                            return 
                        $zahl;

                        Werde das trotzdem morgen nochmal umfangreichen Tests unterziehen. Falls ich mich nicht mehr melde, ist die Funktion so in Ordnung !

                        Als dann, guats Nächtle

                        Kommentar


                        • #13
                          Original geschrieben von deltacon
                          So, so sollte es nun funktionieren, es ist wichtig, dass kein Komma, sondern ein Punkt in der Zahl steht, die gerundet wird, fragt nicht wieso, aber so funktionierts...hat Jemand eine Erklärung?
                          In England ist Komma = Punkt und Tausendertrennzeichen(Punkt) = Komma bei Zahlen, ganz einfach...

                          aber es sollte trotzdem nicht funktionieren, weil du dein Problem nur um Stellen verschiebst, aber es nicht löst...

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            das problem ist auch nicht wirklich lösbar.
                            wie schon gesagt wurde: kommzahlen und binärsystem passt einfach nicht zusammen.

                            Kommentar


                            • #15
                              Aber wieso funktionierts dann so?

                              Testet selbst mal:
                              PHP-Code:
                              $zahl 17.025 100;
                              $zahl round($zahl);
                              $zahl $zahl 100;
                              echo 
                              $zahl
                              -> liefert 17.02


                              PHP-Code:
                              $zahl 17.025 100;
                              $zahl round(str_replace(",""."$zahl));
                              $zahl $zahl 100;
                              echo 
                              $zahl
                              -> liefert 17.03

                              Also hängts definitiv mit dem Komma zusammen, weil aus der Multiplikation eine Zahl mit Komma und nicht Punkt zurückkommt.

                              Jedenfalls stimmen jetzt alle Rundungen!

                              Kommentar

                              Lädt...
                              X