Ergebnisse runden



  • Guten Tag!

    Ich habe folgendes Problem:

    Ich habe Funktionen, die mir bestimmte Ergebnisse liefern. Diese Ergebnisse möchte ich auf die 3. Stelle runden.

    D.h. 3333,33 ---> 3330
    33,3333 ---> 33,3
    0,33333 ---> 0,333

    Ich kenne leider nur den Befehl

    cout<<fixed<<setprecision(a);           // a = Stellen hinter dem Komma
    

    Weiß jemand zufällig, wie man das macht?



  • Was stört Dich denn an dem „Befehl“, den Du schon kennst?



  • krümelkacker schrieb:

    Was stört Dich denn an dem „Befehl“, den Du schon kennst?

    Der rundet ja nicht im (z.B.) Zehner-bereich, sondern nur im 'Komma-bereich'. So eine Rundung ist damit leider nicht möglich:

    3333 -> 3330

    Oder er will keine Rundung bei der Ausgabe, sondern als Integer haben (natürlich wär'n da Stringstreams angebracht).

    'S muss er aber nochmal erklären...

    Edit: also ich würd's so machen:

    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    template<typename T>
    T runde(const T& a, const std::size_t& stellen)
    {
        std::stringstream stream;
        stream << std::fixed << std::setprecision(stellen) << a;
        T rval;
        stream >> rval;
        return rval;
    }
    
    int main()
    {
        std::cout << runde(5.5568, 2) << '\n';//Beispiel
    }
    


  • 3333,33 ---> 3330
    33,3333 ---> 33,3
    0,33333 ---> 0,333

    Die Ergebnisse sollen auf die 3. Stelle gerundet werden und können auch Kommazahlen sein

    3333,33 ---> 3330
    33,3333 ---> 33,3
    0,33333 ---> 0,333

    Es soll im Kommabereich und im Ganzzahlbereich gerundet werden.



  • setprecision verändert nur die Ausgabe auf die gewünschte Anzahl der Nachkommastellen. An dem Wert wird nichts verändert. Will man den Wert selbst runden, braucht man dafür eine Funktion Wert = round(Wert,Nachkommastellen). Einige Compiler haben eine solche Funktion. Wenn nicht, steht eine solche Funktion auf http://berniebutt.npage.de frei zur Verfügung.



  • Danke für die Antworten.

    Ich habe aber bereits eine Lösung gefunden:

    cout<<fixed<<setprecision(2);
    
        /* Korrekte Ausgabe von ig */
        if (ig<1)
                 {
                 cout<<" Ig= "<<ig*1000<<" mA\n";
                 }
        else if (ig>1000)
                 {
                 cout<<" Ig= "<<ig/1000<<" kA\n";
                 }
        else     {
                 cout<<" Ig= "<<ig<<" A\n";
                 }
    

    Es ist zwar nicht genau so wie ich es wollte, aber es reicht.



  • Ich schlage Folgendes vor:

    #include <cmath>
    #include <iostream>
    
    double round_sig(double x, unsigned significant_digits) {
      double x_order = std::floor(std::log10(x));
      double shift = std::pow(10, x_order - significant_digits + 1);
    
      return std::floor(x / shift + .5) * shift;
    }
    
    int main() {
      std::cout << round_sig(3333.33, 3) << '\n';
      std::cout << round_sig(33.3333, 3) << '\n';
      std::cout << round_sig(0.03333, 3) << '\n';
    }
    


  • Danke ich probiere es gleich mal aus.



  • #include <cmath>
    
    double round(double r) 
    {
        return (r > 0.0) ? /*std::*/floor(r + 0.5) : /*std::*/ceil(r - 0.5);
    }
    

    Quelle:

    http://stackoverflow.com/questions/485525/round-for-float-in-c



  • TravisG schrieb:

    #include <cmath>
    
    double round(double r) 
    {
        return (r > 0.0) ? /*std::*/floor(r + 0.5) : /*std::*/ceil(r - 0.5);
    }
    

    Quelle:

    http://stackoverflow.com/questions/485525/round-for-float-in-c

    wie viel hast du gelesen?
    kann deine fkt das:

    D.h. 3333,33 ---> 3330
    33,3333 ---> 33,3
    0,33333 ---> 0,333

    nein, eben nicht... darum gehts aber hier nun mal

    bb



  • Die Rundung der Nachkommastellen geht wie gezeigt. Wenn auch noch in den Vorkommastellen gerundet werden soll, ist noch etwas mehr erforderlich. Hier ein Ansatz zur Diskussion;

    double zz = 3333.33;
    int    ix;
    
    ix = zz;               // 3333
    if(ix > 1000)          // runden in der 3. Vorkommastelle
    {
       zz = ix;            // 3333.00
       zz = ix / 10.0;     // 333.00
       ix = zz;            // 333
       ix *= 10;           // 3330
       zz = ix;            // 3330.00
    }
    


  • oder einfacher:

    int pow_to_ten(unsigned i)
    {
      switch(i)
      {
        case 0: return          1;
        case 1: return         10;
        case 2: return        100;
        case 3: return       1000;
        case 4: return      10000;
        case 5: return     100000;
        case 6: return    1000000;
        case 7: return   10000000;
        case 8: return  100000000;
        case 9: return 1000000000;
      }
    
      return 1000000000;
    }
    
    int runden(float in, unsigned stellen_vor_dem_komma)
    {
      int out = static_cast<int>(in);
      out -= out%pow_to_ten(stellen_vor_dem_komma);
    
      return out;
    }
    
    #include <iostream>
    int main()
    {
      float x = 1987654321.1f;
    
      std::cout << runden(x, 2) << std::endl;
    }
    

    bb


Anmelden zum Antworten