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,333Ich 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,333Die Ergebnisse sollen auf die 3. Stelle gerundet werden und können auch Kommazahlen sein
3333,33 ---> 3330
33,3333 ---> 33,3
0,33333 ---> 0,333Es 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,333nein, 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