Bernd: Runden mit PHP

Hallo,

wenn ich die PHP Funktion round mit zwei Nachkommastellen anwende wird aus

309.826504179

folgendes

309.79

Dieses ist doch falsch?

  1. Hallo Bernd,

    ja, das ist falsch. Aber der Fehler steckt nicht in round().

    echo round(309.826504179, 2);
    

    gibt in http://sandbox.onlinephpfunctions.com schön brav 309.83 aus.

    Ist wohl ein Layer-8 Bug.

    Rolf

    --
    sumpsi - posui - clusi
  2. Hi,

    309.826504179

    folgendes

    309.79

    Dieses ist doch falsch?

    Ja. Bei mir spuckt <?php echo round(309.826504179, 2); ?> 309.83 aus. Hab lokal ne nicht ganz aktuelle 5.6.4, weil ich's kaum noch nutze.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo,

      dann weiß ich leider auch nicht an was das bei mir liegt. Muss ich wohl mit leben dass ich falsche Zahlen bekomme. Ist zwar sehr ärgerlich aber ok.

      1. Hi,

        dann weiß ich leider auch nicht an was das bei mir liegt. Muss ich wohl mit leben dass ich falsche Zahlen bekomme. Ist zwar sehr ärgerlich aber ok.

        Auf gar keinen Fall den Code vorzeigen, der bei Dir zum falschen Ergebnis führt - sonst könnte evtl. jemand erkennen, wo das Problem liegt.

        cu,
        Andreas a/k/a MudGuard

        1. Hallo,

          so wende ich round() an

          $WertZusammenm3 = 187.203532;
          $Wert1 = round(100/$WertZusammenm3*Claudia($mysqli, $array_kategorieuebersicht['id']),2);
          $Wert2 = 1300/100*$Wert1;
          echo $Wert2;
          
          1. Hi,

            $WertZusammenm3 = 187.203532;
            $Wert1 = round(100/$WertZusammenm3*Claudia($mysqli, $array_kategorieuebersicht['id']),2);
            

            Mach daraus mal

            $WertZusammenm3 = 187.203532;
            $innererWert = 100/$WertZusammenm3*Claudia($mysqli, $array_kategorieuebersicht['id']);
            $Wert1 = round($innererWert,2);
            
            echo $innererWert, ":", $Wert1;
            

            und zeig das Ergebnis. Liegt's wirklich am Runden, oder ist schon $innererWert falsch/unerwartet?

            Claudia ist ein toller Funktionsname, da sieht man am Namen doch gleich, was die Funktion macht. Wie kamen die PHP-Macher nur darauf, die Rundungs-Methode round zu nennen - WilliSauerlich wäre doch viel besser gewesen …

            cu,
            Andreas a/k/a MudGuard

            1. Hallo,

              da bekomme ich folgendes Ergebnis

              311.22:311.22
              

              Dieses ist leider falsch, denn der umgerundete Wert lautet

              311.270460431
              

              Und Claudia heißt unser Interes Lager Tool, wenn Claudia irgendwo auftaucht dann weiß jeder was gemeint ist.

              1. Hi,

                da bekomme ich folgendes Ergebnis

                311.22:311.22
                

                Dieses ist leider falsch, denn der umgerundete Wert lautet

                311.270460431
                

                das paßt nicht zusammen. Denn so wie ich das geschrieben hatte, wäre der Wert vor dem Doppelpunkt der ungerundete Wert. Bei Dir steht da aber zweimal der gleiche Wert …

                cu,
                Andreas a/k/a MudGuard

                1. Jetzt aber

                  311.270460431:311.27
                  
                  1. Hi,

                    Jetzt aber

                    311.270460431:311.27
                    

                    paßt doch auch rundungsmäßig zusammen.

                    cu,
                    Andreas a/k/a MudGuard

          2. @@Bernd

            so wende ich round() an

            Wenn du auf zwei Stellen nach dem Komma rundest, kann die daraus entstehende Abweichung bis zu ±0.005 betragen.

            Wenn du dann den gerundeten Wert mit 13 multiplizierst, verdreizehntfach sich auch der Fehler auf bis zu ±0.065.

            Also erst multiplizieren, dann runden.

            LLAP 🖖

            --
            „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
            1. Guten Morgen,

              Wahnsinn war mir so gar nicht klar. Bei ca. 1.500 Einträgen macht dieses natürlich einiges aus 😱

              Also zuerst alles komplett umgerundet zusammenrechnen und ganz zum Schluss bei der Ausgabe den Wert runden?

              1. Tach!

                Also zuerst alles komplett umgerundet zusammenrechnen und ganz zum Schluss bei der Ausgabe den Wert runden?

                Das kommt ganz darauf an, was du vorhast. Wenn du Einzelpreise für eine Rechnung rundest, dann muss die Rechnungssumme von den auf der Rechnung sichtbaren Zahlen gebildet werden, sonst ist der Betrag nicht nachvollziehbar. Wenn hingegen die Bruchteile wichtig sind, muss mit den ursprünglichen Zahlen gerechnet werden, bevor signifikante Teile abgeschnitten werden. Um zum Beispiel DM in Euro umzurechnen mag die gerundete Zahl 2 für einen Überschlag reichen, für Finanzgeschäfte hingegen ist die volle Schönheit von 1,95583 zu verwenden.

                dedlfix.

                1. @@dedlfix

                  Also zuerst alles komplett umgerundet zusammenrechnen und ganz zum Schluss bei der Ausgabe den Wert runden?

                  Meist ja.

                  Das kommt ganz darauf an, was du vorhast. Wenn du Einzelpreise für eine Rechnung rundest, dann muss die Rechnungssumme von den auf der Rechnung sichtbaren Zahlen gebildet werden, sonst ist der Betrag nicht nachvollziehbar.

                  So isses. Bspw. bei Netto- und Bruttopreisen. IIRC kommt die Umsatzsteuer auf jeden einzelnen Artikel drauf und der Betrag wird jeweils auf ganze Cent gerundet. Hast du bspw. einen für 6.66 € und einen für 1.24 € netto, ergibt sich:

                  | Netto | +19% | Brutto | --- | 6.66 | 7.9254 | 7.93 | 1.24 | 1.4756 | 1.48 | === | Summe | | 9.41

                  Würdest du die Nettopreise addieren und darauf 19% draufschlagen, wäre das:

                  | 7.90 | 9.401 | 9.40

                  Die Abweichung um 1 Cent ist in der Finanzwelt tragischer als wenn irgendwo eine Million versackt.

                  LLAP 🖖

                  --
                  „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
                  1. @@dedlfix

                    Also zuerst alles komplett umgerundet zusammenrechnen und ganz zum Schluss bei der Ausgabe den Wert runden?

                    Meist ja.

                    Das kommt ganz darauf an, was du vorhast. Wenn du Einzelpreise für eine Rechnung rundest, dann muss die Rechnungssumme von den auf der Rechnung sichtbaren Zahlen gebildet werden, sonst ist der Betrag nicht nachvollziehbar.

                    So isses. Bspw. bei Netto- und Bruttopreisen. IIRC kommt die Umsatzsteuer auf jeden einzelnen Artikel drauf und der Betrag wird jeweils auf ganze Cent gerundet. Hast du bspw. einen für 6.66 € und einen für 1.24 € netto, ergibt sich:

                    | Netto | +19% | Brutto | --- | 6.66 | 7.9254 | 7.93 | 1.24 | 1.4756 | 1.48 | === | Summe | | 9.41

                    Würdest du die Nettopreise addieren und darauf 19% draufschlagen, wäre das:

                    | 7.90 | 9.401 | 9.40

                    Die Abweichung um 1 Cent ist in der Finanzwelt tragischer als wenn irgendwo eine Million versackt.

                    Also... Deine Tabelle ist irgendwie falsch aufgebaut:

                    Bezeichnung | Netto | UST-Satz | USt 19% | Brutto | Brutto(Gerundet) Artikel A | 6.66 | 19% | 1.2654() | 7.9254 | 7.93() Artikel B | 1.24 | 19% | 0.2356() | 1.4756 | 1.48() Summe | 7.90 | 19% | 1.5010 | 9.4010 | 9.40

                    *) Die Angabe der Umsatzsteuer für Einzelposten hat nur informatorischen Charakter.

                    Für die Rechnung verbindlich ist immer die Gesamtsumme, die sich also aus dem Gesamtnetto errechnet. Sind verschiedene Steuersätze zu beachten, so sind die Netto-Gesamtsummen je Steuersatz zu bilden und aus diesen die Gesamtumsatzsteuer zu errechnen: "das nach Steuersätzen und einzelnen Steuerbefreiungen aufgeschlüsselte Entgelt für die Lieferung oder sonstige Leistung" (§ 14 Absatz 4 Nr. 7 UStG)

                    Bei der Buchung der Rechnung werden - von Käufer und Verkäufer - die Vorsteuer bzw. Umsatzsteuer entsprechend der Rechnung (also die gesamte Umsatzsteuer!) in den entsprechenden Konten (Umsatzsteuer, Vorsteuer) eingebucht. Bei den Sachkonten wird - von Käufer und Verkäufer - stets netto gebucht.

                    Insofern hat die Angabe der Umsatzsteuer für die einzelnen Positionen nur einen informatorischen Charakter im Sinne der Preisangabenverordnung

                    Die Abweichung um 1 Cent ist in der Finanzwelt tragischer als wenn irgendwo eine Million versackt.

                    Nicht in dem Fall. Genau genommen kannst Du auf der Rechnung sogar eine völlig falsche Umsatzsteuer angeben. Allerdings hat das Konsequenzen:

                    Gibst Du zu viel an, dann musst Du auch diese zu hohe Umsatzsteuer in Deiner Vorsteueranmeldung angeben. Sonst wäre das mindestens Steuerhinterziehung. Bist Du dabei im Irrtum (was immer dann anzunehmen ist, wenn Du nicht in der Absicht handelst, Dich oder hier den Staat zu Unrecht zu begünstigen) ist das gegenüber dem Käufer nicht mal Betrug: Denn § 263 StGB beginnt mit: "Wer in der Absicht, sich oder einem Dritten einen rechtswidrigen Vermögensvorteil zu verschaffen … ". Allerdings kann das zivilrechtlich die Folge einer Rückzahlungsverpflichtung haben: Viel Spaß beim Buchen derselben.

                    Gibst Du zu wenig an, dann kann das Finanzamt von Dir die Nachzahlung der zu Unrecht nicht verlangten Umsatzsteuer verlangen. Theoretisch kannst Du das an den betroffenen Kunde weiterreichen. Praktikabel ist das "eher nicht", weil Verbraucher dann in vielen Fällen vom Vertrag zurücktreten können (sehen sich getäuscht) und darunter der Ruf des Unternehmens leidet. Also bucht man die nachgezahlte Umsatzsteuer auch nach, aber ggf. die Strafgebühren vielleicht eine geringe Geldstrafe (die mangels eines Unternehmensstrafrechts in Deutschland immer eine sehr persönliche Sache ist) unter "Lehrgeld".

                2. Hallo dedlfix,

                  bei Berechnungen mit € und prä-€ Währungen gibt's noch viel mehr Vorschriften was Zwischen- und Endrundungen angeht. Ich habe die damals nicht alle lernen müssen, weil es dafür einen standardisierten Euro-Rechner gab, aber es ist mehr als „multipliziere mit dem richtigen Faktor“. Unter bestimmten Umständen musste mit 4 Nachkommastellen gerechnet und gerundet werden.

                  Ob das im Geschäftswesen bei Rechnungen mit Geldbeträgen ebenso gilt, weiß ich nicht. Bisher hatte ich in meinem Arbeitsleben nichts mit komplexen Betragsumrechnungen zu tun. Einfach mit double-Werten rumrechnen und am Ende auf 2 Nachkommastellen runden klingt zwar mathematisch vielversprechend, könnte aber buchhalterisch falsch sein. Da können wir jetzt nur hoffen, dass Bernd fachlich weiß, was er tut

                  Rolf

                  --
                  sumpsi - posui - clusi
              2. Aloha ;)

                Also zuerst alles komplett umgerundet zusammenrechnen und ganz zum Schluss bei der Ausgabe den Wert runden?

                Meist ja - wie Gunnar bereits sagte.

                Falls dich die Thematik interessiert und du dich fragst, wo vielleicht außer beim Runden noch Probleme beim Rechnen mit Rechnern auftauchen können, gibts dazu einen Artikel im Wiki.

                Grüße,

                RIDER

                --
                Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[