Nachkommastellen
-
Hallo,
habe folgenden Code geschrieben:
#include<stdio.h> #include<stdlib.h> berechnung(double anfangskap, double zinssatz, int jahre) { int i; double endkap; endkap=anfangskap; for (i=0;i<jahre;i++) endkap=endkap*(1+zinssatz/100); return (endkap); } main(){ double zs,ak,geskap; int n; printf("Bitte Anfangskapital eingeben: "); scanf("%lf",&ak); printf("Bitte Zinssatz eingeben:"); scanf("%lf",&zs); printf("Bitte die Anzahl der Jahre eingeben:"); scanf("%d",&n); geskap=berechnung(ak,zs,n); printf("Das Gesamtkapital betraegt %.2lf\n", geskap); system("pause"); return 0; }
Jetzt mein Problem: Wenn ich mir in der Funktion berechnung das endkap ausgegeben lasse bekomm ich ein wert mit Nachkommastellen (z.B. ,03) aber wenn ich mir in der main das geskap ausgeben lasse was ja das gleiche ist wie endkap bekomm ich dann ,00 als Nachkommateil. Woran liegt das?
-
Da du keinen Rückgabetyp angegeben hast, geht C davon aus, dass du int meinst.
double berechnung(double anfangskap, double zinssatz, int jahre) { ...
Darum gib immer einen Rückgabetyp an. Wenn du keinen willst, nimm void.
Und bei Berechnungen, bei denen es um Geld geht, rechne in Cent und ganzzahlig.
-
Alternativ kannst Du auch ohne Rückgabetypen arbeiten und den entsprechenden Funktionen, die Werte errechnen / verändern einen Zeiger auf Deine zu ändernde Variable mitgeben. Dann musst Du zwar den Aufruf und die Funktion minimal abändern und bei der Verarbeitung von Arrays gut Acht geben, dafür kannst Du mehrere Werte in der Funktion "verarbeiten" und bist demzufolge etwas "handlungsfreier".
Und um DirkB noch mal beizupflichten (was fast immer eine gute Entscheidung ist): Es ist grob unüblich, Geldbeträge über Fließkommazahlen zu berechnen.
Sollten Dir "normale" Integer für die Zahlengröße bzgl. Anzahl der Ziffern nicht ausreichen, gibt es beispielsweise auch noch den Datentyp long, der selbst für meinen Kontostand (S oder H bleibt Eurer Phantasie überlassen) genug Spielraum bietet.
-
Ein Rückgabewert macht die Sache aber erheblich einfacher.
Und ein long int (32-bit) reicht ja nur bis ~21 Millionen.
Für große Geldbeträge gibts dann noch long long. (Das sind dann 64-bit)Oder für Dagobert Duck gib es dann noch Bignum. Aber der zählt sein Geld lieber selber.
-
baerminator schrieb:
printf("Das Gesamtkapital betraegt %.2lf\n", geskap);
Die Formatangabe für printf stimmt so nicht. Bei float muss es z.B. vollständig heissen %21.2f für insgesamt 21 Stellen mit 2 Nachkommastellen.
-
berniebutt schrieb:
baerminator schrieb:
printf("Das Gesamtkapital betraegt %.2lf\n", geskap);
Die Formatangabe für printf stimmt so nicht. Bei float muss es z.B. vollständig heissen %21.2f für insgesamt 21 Stellen mit 2 Nachkommastellen.
Nicht jeder will für eine Zahl, die aus 5 Zeichen besteht, gleich 21 Zeichen verbraten. Mit deiner Methode kannst du sicherlich nicht viel auf deiner Console nebeneinander ausgeben
-
It0101 schrieb:
berniebutt schrieb:
baerminator schrieb:
printf("Das Gesamtkapital betraegt %.2lf\n", geskap);
Die Formatangabe für printf stimmt so nicht. Bei float muss es z.B. vollständig heissen %21.2f für insgesamt 21 Stellen mit 2 Nachkommastellen.
Nicht jeder will für eine Zahl, die aus 5 Zeichen besteht, gleich 21 Zeichen verbraten. Mit deiner Methode kannst du sicherlich nicht viel auf deiner Console nebeneinander ausgeben
Der Fragesteller hat doch 21 genannt. Wenn weniger Stellen reichen gibt man eben im Formatstring weniger an, z.B. %5.2f
Erscheint mir jetzt als Dödelkram!
-
berniebutt schrieb:
...
Der Fragesteller hat doch 21 genannt....Wo denn? Ich finde das nicht.
-
2lf ( 2 LF ) != 21f ( [20+1]F )
-
printf in native C ist nun einmal etwas holprig wegen der Trennung zwischen den Formaten und den Ausgaben im Aufruf der Funktion. Könnte Anlass geben, einmal auf C++ und der dort extrem einfachen Handhabung mit Streamklassen zu sehen?
cout << setw(10) // Anzahl der Stellen insgesamt << setprecision(2) // Anzahl der gewünschten Nachkommastellen << floatVariable // darzustellende Fliesskommazahl
So haben viele ältere C-Programmierer den Umstieg begonnen als es eines Tages C++ gab und Gefallen an mehr gefunden. Wer bei native C bleiben möchte kann die beiden Funktionen dtoa() und round() von meiner Homepage http://berniebutt.npage.de verwenden oder einfach nur sehen, wie es geht.