Abrunden in c++
-
Hey Leute,
ich hab verschiederen Zahlen, die ich immer abrunden möchte!z.B.:
a = 7288.9164;
b = 2.1213
c = 112.2323;
d = 212123.983
wie muss ich das machen?bei Google hab ich nach langem suchen so was in der Richtung gefunden:
i = floor (i * 100)/100;
funktioniert zwar, rundet aber nicht immer ab.
MfG Flo
-
caste nach int und dann wieder zurück...
-
FlorianB schrieb:
[...]
funktioniert zwar, rundet aber nicht immer ab.MfG Flo
Sondern?
-
@ Skym0sh0 :
wie geht caste nach int und dann wieder zurück...?
sag mir nix@ Tachyon :
rundet bei >5 auf und bei <5 ab
gruß flo
-
FlorianB schrieb:
@ Skym0sh0 :
wie geht caste nach int und dann wieder zurück...?
sag mir nixDann schlag mal in deinem Lehrbuch unter "Cast", "type cast" oder "Typumwandlung" nach.
PS: floor() sollte eigentlich auch abrunden, zumindest wenn es korrekt implementiert ist.
-
FlorianB schrieb:
@ Tachyon :
rundet bei >5 auf und bei <5 ab
gruß floZeig mal den Code. Das kann ich eigentlich nicht glauben. Rechnest Du zufällig mit
int
-Literalen?
-
mein code sieht im moment so aus:
#include <iostream> #include <conio.h> #include <math.h> using namespace std; int main() { { double a = 728308.58; a = floor (a * 100)/100; cout << "a:" << a; } getch(); }
bis jetzt nur die eine Umrechnung. Später will ich das ganze dann mal noch mit mehr Zahlen und mit Tastatureingabe probieren.
MfG flo
-
Was soll die Miltiplikation mit 100 und division danach? Hast du das einfach per copy&paste aus dem Netz gefischt ohne den Sinn zu hinterfragen oder hast du das absichtlich eingebaut?
-
#include <iostream> //Sollte ohne *.h gehen. #include <math> using namespace std; int main() { int a=(int)floor(728308.58); cout<<"a: "<<a<<"\n"; cin.get(); }
Nix zu danken!
-
Glühbirne schrieb:
#include <iostream> //Sollte ohne *.h gehen. #include <math> using namespace std; int main() { int a=(int)floor(728308.58); cout<<"a: "<<a<<"\n"; cin.get(); }
Nix zu danken!
Tut aber auch was komplett anderes.
-
So müsste es doch gehen:
#include <iostream> #include <conio.h> #include <math.h> using namespace std; int main() { double a = 728308.58; a = floor(a); cout << a << endl; getch(); }
Das mit dem mal 100, dann abrunden und dann wieder teil durch 100 macht man, wenn man z.B. auf 2 Nachkommastellen genau runden möchte.
-
Tachyon schrieb:
Tut aber auch was komplett anderes.
Soweit ich ihn verstanden habe, will er das Ergebnis abgerundet bekommen - immer. Ohne weitere Spezifikation heißt das für mich: kill den Nachkommateil. Und so sollte es funzen.
-
Glühbirne schrieb:
int a=(int)floor(728308.58);
Das ist mal absolut unnötig komplex und blödsinnig.
- wenn schon casten, dann bitte mit C++-Casts, nicht mit dem C-Cast.
- wenn du den double einem int zuweist, brauchst du nicht explizit zu casten, das geschieht automatisch.
- Wenn der OP den Wert als double erhalten will, ist der Cast zum int Unsinn, dann reicht floor.
- Wenn der OP den Wert als int erhalten will, ist floor unnötig, es reicht die einfache Zuweisung, weil die Konvertierung die Nachkommastellen sowieso verwirft.
-
Nach dem Eingangspost hätte man schon davon ausgehen können, dass er auf zwei Nachkommastellen abrunden will.
-
pumuckl schrieb:
Das ist mal absolut unnötig komplex und blödsinnig.
- wenn schon casten, dann bitte mit C++-Casts, nicht mit dem C-Cast.
- wenn du den double einem int zuweist, brauchst du nicht explizit zu casten, das geschieht automatisch.
- Wenn der OP den Wert als double erhalten will, ist der Cast zum int Unsinn, dann reicht floor.
- Wenn der OP den Wert als int erhalten will, reicht die einfache Zuweisung, weil die Konvertierung die Nachkommastellen sowieso verwirft.Dachte ich auch, bis mir mein Compiler gestern eine Fehlermeldung rausgehauen hat, weil die implizite Typumwandlung eben nicht durchgeführt wurde. Ein total depperter Fehler, die beiden Typen hätten ohne Probleme ineinander konvertierbar sein sollen, und trotzdem ...
Deshalb schreibe ich lieber explizite Casts. Wo du allerdings recht hast, ist, dass ich
static_cast
hätte verwenden können.
-
Afaik geben Compiler eine Warnung heraus, wenn du eine möglicherweise verlustbehaftete Konvertierung (z.B. double->int) durchführen willst. Aber wenn du nicht mit der Option "betrachte Warnungen als Fehler" (o.ä.) compilierst, sollte das keine weiteren Konsequenzen haben.
-
@ pumuckel:
ich hab des so bei google gefunden.wenn ich
double i = 728308.958; int a=(int)floor(i); cout << a;
verwende funktioniert es.
ich hab vergessen zu erwähnen, dass ich die Nachkommastellen weg haben möchte!
aba das tut es ja jetzt.@ pumukel:
ist das jetzt falsch so?
also ich bin damit zufrieden.thx
MfG flo
-
Den int-cast brauchst du nicht explizit zu schreiben, so geht auch:
double i = 728308.958; int a= floor(i); cout << a << endl;
Brauchst du wirklich eine neue int-Variable? Schau dir mal meinen Code weiter oben an. Es ist nicht zwingend notwendig eine neue Variable einzuführen. Aber wenn du sie brauchst, dann ist das IMHO in Ordnung.
-
FlorianB schrieb:
ist das jetzt falsch so?
pumuckel wollte damit sagen, dass man es nicht verkomplizieren soll. Wenn du es als Ganzzahl willst, dann so:
double i = 1.23; int a=i; // Warnung, da Informationsverlust. // und wenn du die Warnung nicht willst, dann kannst du explizit casten. Nun weiß der Compiler, dass dir der Informationsverlust bewusst und schnuppe ist. a=static_cast<int>(i);
-
Was willst Du denn haben? Ein Integer, oder ein Float ohne Nachkommanateil? Das ist ein Riesenunterschied.