Ein eigenes Programm zum Runden
-
Hallo zusammen,
ich versuche momentan ein kleines Programm zu schreiben, dass Zahlen rundet. Zwar kann ich das einfach mit dem Manipulator "setprecision" machen,
doch versuche ich dies auf eigene Weise zu schaffen.Bis jetzt habe ich folgendes:
#include <iostream> using namespace std; int main() { double x=0.0, sign=1.0; cout << " ****** Runden *******\n\n"; cout << "Geben Sie eine Kommazahl ein: "; cin >> x; if (x < 0.0) { x = -x; sign = -1.0; } int temp; temp = x; cout << "Der gerundetete Wert lautet: " << sign*x << endl; return 0; }
Das Problem ist, dass hier einfach allen Zahlen die Kommastellen abgeschnitten werden. Ich muss noch hinkriegen, dass ab x,5 aufgerundet wird.
Ich dachte, dass ich in einer Schleife prüfe, ob von 0,1 bis 0,5 eine ganze Zahl erscheint. Dann müsste aufgerundet werden.Mein Problem: Wie kann ich dem Compiler beibringen, dass es sich um eine ganze Zahl handelt?
Vielen Dank
lg, freakC++
-
Da gibt es mehrere möglichkeiten. Entweder, den double wert in einen String umwandeln (am besten mit .precision(1) ) und gucken, was für eine ziffer direkt hinter dem komma steht. Oder den double wert *= 10 rechnen, in int umwandeln, dann aufgrund der "neuen" einerstelle runden und wieder /=10 rechnen.
-
Wenn du auf eine Ganzzahl runden willst, kannst du *10 und +5 und /10 rechnen.
Beispiel:
double d=1.4; int i=(d*10+5)/10; //i ist 1, ab 1.5 ist i==2.
-
Noch einfacher ist:
double d=1.4; int i=d+0.5; // i==1, ab 1.5 ist i==2.
-
freakC++ schrieb:
[...] double x=0.0, sign=1.0; [...] if (x < 0.0) { x = -x; sign = -1.0; } int temp; temp = x; cout << "Der gerundetete Wert lautet: " << sign*x << endl; [...] }
Warum ist "sign" ein double ?
Warum schreibst Du "int temp; temp=x;" statt "int temp = x" ?Das mit dem Runden ist relativ einfach. Da x nicht negativ ist (Du fängst den Fall ja ab) kannst Du einfach schreiben
int temp = x + 0.5;
Die Nachkommastellen werden bei der Konvertierung zu int ja abgeschnitten. Wenn x negativ ist, müsstest Du die 0.5 abziehen.
Gruß,
SP
-
Sebastian Pizer schrieb:
Das mit dem Runden ist relativ einfach. Da x nicht negativ ist (Du fängst den Fall ja ab) kannst Du einfach schreiben
int temp = x + 0.5;
Die Nachkommastellen werden bei der Konvertierung zu int ja abgeschnitten. Wenn x negativ ist, müsstest Du die 0.5 abziehen.
Oder für eine allgemeine Lösung floor(x + 0.5) nehmen.
-
Hallo zusammen,
@Sebastian Pizer: Die komische Schreibweise liegt an meinen Probierveruchen...@_matze: Aber das ist doch kein richtiges Runden. Wenn ich 1.4 runde, dann kommt 1 raus und nicht 2. Oder verstehe ich euch falsch?
Da scheint mir XMasters Lösung schon realistischer!?
Vielen Dank für euer Bemühen.
lg, freakC++
-
Hallo nochmal,
ich merke, dass ein Problem noch wo ganz anders liegt. Schaut euch mal diesen Code an:int main() { double x=0.0, sign=1.0; cout << " ****** Runden *******\n\n"; cout << "Geben Sie eine Kommazahl ein: "; cin >> x; if (x < 0.0) { x = -x; sign = -1.0; } cout << x; //wird ohne Kommastellen ausgegebn
Anscheinend funktioniert schon die Eingabe einer Kommazahl nicht. Wenn ich x wieder ausgebe, dann ist das immer die eingebene Kommazahl nur ohne Kommas...einfach abgeschnitten!
Woran liegt das?
Vielen Dank
lg, freakC++
-
Dein Programm ist korrekt und müsste Gleitkommazahlen korrekt wiedergeben.
Nur um sicher zu gehen: Du tippst bei der Eingabe aber schon . statt ,?
-
freakC++ schrieb:
@_matze: Aber das ist doch kein richtiges Runden. Wenn ich 1.4 runde, dann kommt 1 raus und nicht 2.
Ja, soll es doch auch.
1.0-1.4 wird zu 1
1.5-1.9 wird zu 2(1.410+5)/10==1
(1.510+5)/10==2
-
ahh....ich meine es natürlich genau anders herum....sry
lg, freakC++
-
Ha, ich habe es hinbekommen. Es gab so einiges, dass mich verwirrt hat, aber nun funktioniert es!
Vielen Dank für euer Bemühen!
lg, freakC++@SeppJ: Warum nimmt das Programm es eigentlich einem nicht übel, wenn man 5,6 anstatt 5.6 eingibt. Ich habs ausprobiert und es kommt kein Fehler.
-
SeppJ schrieb:
Oder für eine allgemeine Lösung floor(x + 0.5) nehmen.
Einen klitzekleinen -- zugegebenermaßen vernachlässigbaren -- Unterschied gibt es da schon noch:
x | int(x+(x<0?-0.5:0.5)) | floor(x+0.5) | Kaufmännisches Runden | ------+-----------------------+-------------- -3.51 | -4 | -4 -3.50 | -4 | -3 <--- -3.49 | -3 | -3 2.49 | 2 | 2 2.50 | 3 | 3 2.51 | 3 | 3
Gruß,
SP
-
freakC++ schrieb:
@SeppJ: Warum nimmt das Programm es eigentlich einem nicht übel, wenn man 5,6 anstatt 5.6 eingibt. Ich habs ausprobiert und es kommt kein Fehler.
Warum sollte es? istream operator >> double liest eine Kommazahl ein und lässt den Rest des Eingabepuffers unangetastet. Schreibt man also 5.6, so wird 5.6 als Kommazahl erkannt und eingelesen. Der Eingabepuffer ist danach leer. Tippt man 5,6 so wird die 5 als Zahl erkannt. Das Komma gehört nicht mehr zu der Zahl, somit verbleibt ,6 im Eingabepuffer und würde bei der naächsten Eingabe eingelesen werden.
edit: Wenn du das besser verstehen willst, solltest du dich intensiver mit dem stream Konzept von C++ beschäftigen (es lohnt sich, das gut zu verstehen). cin >> double hat nämlich eine ziemlich andere Bedeutung als 'warte bis eine Zahl und danach Enter auf der Tastatur getippt wurden und gib mir die Zahl' - auch wenn viele Anfänger meinen, dass dies so wäre.
-
Hallo,
mmh...ich arbeite gerade das Buch "C++ Lernen und professionell anwenden" von Ulla Kirch-Prinz und Peter Prinz durch.
Mal schaun, ob das Thema noch angesprochen wird. Zwar kamen schon Streams dran, doch so ausfühlich war das Thema nicht dargelegt.
Vielen Dank
lg, freakC++PS.: Morgen ist Schule....*schnüff*...da schwindet dann wieder meine C++ Zeit