Ankündigung

Einklappen
Keine Ankündigung bisher.

Float Preis auf x.09 runden

Einklappen

Neue Werbung 2019

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

  • Float Preis auf x.09 runden

    Hallo,

    ich würde gerne float Werte nach dem zweiten Kommarwert auf .09 runden. Es geht speziell um Preise.

    Aus:
    -,01
    -,02
    -,03
    -,04
    -,05
    -,06
    -,07
    -,08
    wird –,09

    Beispiel:
    10,50 Euro + 30%
    = 10,50 + 3,15 = 13,65
    zzgl. dem Aufrunden 13,69

    Weiß jemand wie ich das anstelle?

    Danke,
    rimbimbi

  • #2
    ceil(X * 10) / 10 - 0.01
    Besser noch mit bcmath

    Kommentar


    • #3
      Preise in float sind generell fail, grade wegen der Rundungsungenauigkeiten.

      Falscher Datentyp!
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        bcmath verwendet strings statt floats. Das finde ich effektiver als alles erst immer nach Int umzurechnen und für die Anzeige zuruckzurechnen. Gmp finde ich persönlich irgendwie zu seltsam.

        Kommentar


        • #5
          Nur so: Integer auf Zehner, Hunderter, … abrunden:

          PHP-Code:
          $roundedDown $i $i 10
          Aufrunden:

          PHP-Code:
          $roundedUp $i + (10 $i 10); 
          Funktionen wie ceil und floor liefern „dummerweise“ immer Fließkommazahlen zurück. Mit Modulo-Operatoren sollten alle Werte Integer bleiben.

          Kommentar


          • #6
            Dein Beispiel und die Zeilenreihe ist irgendwie verwirrend.

            Laut Beispiel würde ich einfach die die letzte Nachkommastelle auf 9 setzen. Wenn die Regel anders lautet halt die letzte Nachkommastelle auf 9 wenn die vorletzte Nachkommastelle 0 ist.

            Kommentar


            • #7
              Das tönt vielleicht einleuchtend, ist jedoch nicht ganz so trivial. Wenn du wüsstest, wie ein float oder double gespeichert wird, wüsstest du auch, dass die letzte Nachkommastelle nicht bewusst die 2. Stelle sein muss.

              PHP-Code:
              php var_dump(0.9 0.3 == 0.6);
              bool(false
              Und solch ein "fixes" setzen widerspricht dem Programmierer in uns.
              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

              Kommentar


              • #8
                Zitat von lstegelitz Beitrag anzeigen
                Preise in float sind generell fail, grade wegen der Rundungsungenauigkeiten.

                Falscher Datentyp!
                Welchen Datentyp würdest du denn für Preise verwenden?

                Kommentar


                • #9
                  Zitat von rimbimbi Beitrag anzeigen
                  Welchen Datentyp würdest du denn für Preise verwenden?
                  int wäre eine Möglichkeit.
                  [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                  Kommentar


                  • #10
                    Zitat von rimbimbi Beitrag anzeigen
                    Welchen Datentyp würdest du denn für Preise verwenden?
                    Das nennt sich Festkommazahl (im Gegensatz zu Fliesskommazahlen, floats).

                    Eine Variante hatte mermshaus gezeigt: Integerzahlen, die Cent (nicht Euro) darstellen. Ebensogut kann man festlegen, das man 1/10 Cent oder 1/100 Cent mit '1' festlegt, dann kann man auch z.B. Tankstellenpreise abbilden (Diesel kostet 129,9 Cent, bei 1/10 Stückelung also 1299 Zehntelcent, bei 1/100 Stückelung 12990 Hunderstelcent)
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Hehe, wenns ein String ist, könntest du das machen:

                      PHP-Code:
                      echo preg_replace("/^(.*)[1-8]$/U""$1""19,95") . "9"
                      Bitte machs nicht, ist eher ein Scherz*g*
                      Tutorials zum Thema Technik:
                      https://pilabor.com
                      https://www.fynder.de

                      Kommentar


                      • #12
                        Zitat von Andreas Beitrag anzeigen
                        Hehe, wenns ein String ist, könntest du das machen:

                        PHP-Code:
                        echo preg_replace("/^(.*)[1-8]$/U""$1""19,95") . "9"
                        Bitte machs nicht, ist eher ein Scherz*g*
                        Haha, guter Wochenstart. So mache ich es bestimmt nicht.

                        Hat noch jemand eine andere Lösung mit FLOAT als Datentyp?

                        Grüße,
                        rimbimbi

                        Kommentar


                        • #13
                          Wie viele Lösungen brauchst du denn insgesamt?

                          Edit: Beitrag #2 hier im Thread, falls das nicht klar sein sollte.

                          Kommentar


                          • #14
                            Zitat von rimbimbi Beitrag anzeigen
                            Hat noch jemand eine andere Lösung mit FLOAT als Datentyp?
                            Eine "andere" Lösung mit FLOAT, wobei float dir bereits als "nicht geeignet" genannt wurde?

                            Lass mich kurz überle..NEIN!
                            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                            Kommentar

                            Lädt...
                            X