Zahlen runden



  • Hi!
    Wie kann ich eine Float-Zahl auf zwei Nachkommastellen runden?
    Ohne z.B. %7.2f zu benutzen. Ist das mit einfachsten Mitteln möglich?
    Vielen Dank für eure Hilfe!



  • Ja, such mal im Forum. Wurde schon oft gefragt. Kurz: Du multiplizierst mit 1000 und weist das einem Integer zu. Dann holst du dir die letzte Ziffer mit dem %-Operator und merkst dir ob die >= 5 ist. Dann dividierst du durch 10 und addierst eine 1, falls die letzte Ziffer >= 5 war. Nun weist du das Ganze einem float zu und teilst durch 100, fertig! Ist nur auf die Schnelle, kann also Denkfehler enthalten. Einfach mal ausprobieren ;).



  • Hi!
    Hab's so gemacht:
    float j;
    int h;
    K=(K+0.005)*100;
    h=K;
    j=h/100;

    Das funktioniert aber nicht. Es kommt nur so etwas wie 203.00000000 obwohl 203.28 erscheinen müsste. Seht ihr einen Fehler?



  • Ganzzahldivision im letzten Schritt...



  • ??? Ganzzahldivision ????
    Eine kleine Erläuterung bitte für mich 🙂



  • Bei einer int-Division entstehen keine Kommas, das Ergebnis wird ganzzahlig. Teile durch 100.0f, in dem Fall castet der Compiler automatisch h nach float und berechnet wie gewünscht. Letztendlich müssen ja beide Zahlen float sein, damit korrekt gerechnet werden kann, und das wird erreicht, wenn einer der beiden (Dividend/Divisor) float ist.



  • Ahh, alles klar!
    Jetzt hab ich aber so ein Ergebnis: 203.27999999
    Woran könnte das liegen?



  • Hi!
    Hab ne Lösung gefunden. Wenn man printf mit %g anstatt mit %f aufruft, wird die richtige Zahl dargestellt. Aber warum ist das so?



  • Golfi schrieb:

    Ahh, alles klar!
    Jetzt hab ich aber so ein Ergebnis: 203.27999999
    Woran könnte das liegen?

    Es liegt daran, dass die Builtin-Gleitkommatypen nicht beliebig genau sind. Wurde aber auch schon zigmal hier erklärt warum (-> Forensuche).



  • zum Beispiel so:

    //---------------------------------------------------------------------------
    // LUT für 10^x (max. x = 9)
    //---------------------------------------------------------------------------
    static const double Power10_LUT[] = {      1.0,      10.0,      100.0,      1000.0,      10000.0,
                                          100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0 };
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    // Funktion rundet die angegebene Gleitkommazahl auf die gewünschte
    // Anzahl an Nachkommastellen.
    //
    // Parameter:
    // ==========
    //   double Value     :  zu rundender Wert
    //   int    Precision :  Anzahl der Nachkommastellen
    //
    // Rückgabe:
    // =========
    //   double           :  auf Precision gerundeter Wert
    //---------------------------------------------------------------------------
    double Round(const double Value, const int Precision)
    {
      if (Precision < 0) return Value;
    
      double Power10;
    
      if (Precision > 9) Power10 = pow(10.0, (double) Precision);
      else               Power10 = Power10_LUT[Precision];
    
      double TmpValue   = Value * Power10;
      double FloorValue = floor(TmpValue);
    
      return (FloorValue + 0.5) >= TmpValue ? ( FloorValue        / Power10) : 
                                              ((FloorValue + 1.0) / Power10);
    }
    

Anmelden zum Antworten