Probleme mit Nachkommastellen
-
Hallo,
ich habe da mal ein Frage bzw ein Problem und benötige eure Hilfe..
Ich habe jetzt ein Programm zur Berechnung der Rückzahlung eines Konsumentenkredits geschrieben und habe es eigentlich auch fertig nur noch zwe kleine Problemchen...obwohl ich
printf(" %2.0lf %3.2lf %3.2lf %5.2lf\n", ++monat, z, tilg, rest);
meine var rest mit %3.2lf auf 2 nachkommastellen begrenzt habe, gibt er mir irgendwann ergebnisse mit drei nachkommastellen...ich habe auch folgendes geschrieben:
if( rest <= 0.01 ) rest = 0;
trotzdem gibt er mir den Wert 0,007 aus..ich versteh das nicht:(
wenn ich runde dann werden die ergebnisse immer ungenau..die nachkommastellen ab 3 sollen einfach abgeschnitten werden...
mein zweites problem bzw unwissenheit ist, dass ich nicht weiss wie man es schafft, dass fließkommazahlen so untereinander stehen , dass die punkte untereinander sind..also alle nachkommastellen auch untereinander...
folgende sachen mach ich nur mit rest:
for ( h = 0; h != 6;h = rest + (2*3) ) { //Bildschirm löschen und wieder zu Position x,y gehen do { ++i; //Hilfsvariable, wenn 12 Monate erreicht neue Tabelle z = rest * (30.0/360.0) * (nz/100.0); //Zinsberechnung if( (r-z) >= rest ) tilg = rest; else tilg = r - z; //Restbetrag nicht negativ wird rest = rest - tilg; //Restbetrag berechnen if( rest <= 0.01 ) rest = 0; printf(" %2.0lf %3.2lf %3.2lf %5.2lf\n" , ++monat, z, tilg, rest); //Ausgabe der monatlichen Zahlungen } while( i < 12 );
-
Hallo,
wenn die Breite des Feldes immer gleich ist und auch die Anzahl der Nachkommastellen identisch ist, sollten die Zahlen so untereinander kommen, daß die Dezimalpunkte auch untereinander liegen. Achte aber darauf, daß die Zahlen klein genug bleiben, um in der Breite des Feldes genug Platz zu haben.
Dein Codeausschnitt sieht korrekt aus. Aber ich sehe leider nicht, welche Datentypen Deine Variablen haben. Vieleicht steckt da das Problem.
mfg Martin
-
Für dein Problem "Komma der Zahlen untereinander" bietet printf folgende Möglichkeit
//zwischen Prozent und der Zahl 10 LEERZEICHEN NICHT VERGESSEN printf("% 10.2f\n", 23.1234); printf("% 10.2f\n", 2345.1);
-
alle double
-
zu basicman...wenn ich das so mache stehen nur alle ersten ziffern untereinander...
-
ich glaube nur, was ich sehe ... also *g* her mit dem Code
-
//Einfügen benötigter Programmdateien //=================================== #include "stdafx.h" #include <stdio.h> //C-Standard-I/O-Bibliothek #include <math.h> //C Mathe-Bibliothek #include "vsconio.h" //Borland spezifische I/O-Bibliothek int main(void) { //Variablenvereinbarung //===================== double Kbedarf, k; //Var für Kreditbetrag double nz; //Var für Nominalzins double zf; //Zinsfaktor pro Monat double rmin, r; //Var für monatliche Rate double z; //Var für Zinsen double rest; //Var für Restschuld double tilg; //Var für Tilgung double monat; //Var für Ratennr double zbetrag; //Var für Zinsbetrag double zk; double effektivz; int i, h; //Hilfsvariable int x,y, a, b; //Var für wherex und wherey int zeichen; //Variable für Entereingabe char dummy [81]; //Programmanweisungen //=================== clrscr(); //Bildschirm löschen printf("Bankhaus Kauf & Rausch -> Berechnung von" "Konsumentenkrediten J.S. & J.W.\n"); printf("*****************************************" "**************************************\n\n\n"); printf("Kreditbedarf [500..10T] : "); scanf("%lf", &Kbedarf); //Kreditbedarf wird erzeugt k =((int)Kbedarf+99) / 100*100; //Kredtibedarf wird auf nächsten 100er gerundet if(Kbedarf < 500.00) k = 500.0; //Kreditlimit wird eingeschränkt else if(Kbedarf > 10000) k = 10000.0; printf("Kreditbetrag [Euro] : %.0lf \n" "Nominalzinsen [%%] : ",k); scanf("%lf", &nz); zf = 1 + (nz/100/12); //dient zur Berechnung der monatlichen Mindestraten rmin = k * pow(zf,60.0) * ((zf-1)/(pow(zf,60.0)-1)); //Die monatliche Mindestrate wird berechnet// printf("monatl. Rate [R > %5.2lf Euro] : ",rmin); a = wherex(); b = wherey(); //Cursorposition merken scanf("%lf", &r); gets(dummy); if( r < rmin ) { r = rmin; gotoxy(a,b); //Der eingegebene Wert r wird gelöscht und printf("%.2lf",r); //durch rmin ersetzt wenn dieser größer r ist } printf("\n\nRatenNr Zinsen Tilgung Restschulden\n"); printf("-------------------------------------------\n"); x = wherex(); y = wherey(); //Cursorposition merken rest = k; for ( h = 0; h != 6;h = rest + (2*3) ) { clreol(); gotoxy(x, y); //Bildschirm löschen und wieder zu Position x,y gehen do { ++i; //Hilfsvariable, wenn 12 Monate erreicht neue Tabelle z = rest * (30.0/360.0) * (nz/100.0); //Zinsberechnung zbetrag = zbetrag + z; //Summe der Zinsen erzeugen if( (r-z) >= rest ) tilg = rest; //Tilgung = Restbetrag, damit der else tilg = r - z; //Restbetrag nicht negativ wird rest = rest - tilg; //Restbetrag berechnen if( rest <= 0.01 ) rest = 0; printf(" %2.0lf %3.2lf %3.2lf %5.2lf\n" , ++monat, z, tilg, rest); //Ausgabe der monatlichen Zahlungen if( monat == 1 ) effektivz = z/rest *12 *100; //Effektivzinsberechnung } while( i < 12 ); i = 0; if( monat == 60 ) { zk = zbetrag/k * 100; //Zinsen/Kredit berechnen gotoxy(x + 45,y); //Cursor in Spalte(x+45) & Zeile y setzen printf("Gesamtuebersicht\n"); gotoxy(x + 45,y+1); //Cursor in Spalte(x+45) & Zeile(y+1) setzen printf("------------------------------\n"); gotoxy(x + 45,y+2); //Cursor in Spalte(x+45) & Zeile(y+2) setzen printf("Kreditbetrag [Euro] : %5.2lf\n",k); gotoxy(x + 45,y+3); //Cursor in Spalte(x+45) & Zeile(y+3) setzen printf("Zinsbetrag [Euro] : %3.2lf\n",zbetrag); gotoxy(x + 45,y+4); //Cursor in Spalte(x+45) & Zeile(y+4) setzen printf("Zinsen/Kredit [%%] : %3.2lf\n",zk); gotoxy(x + 45,y+5); //Cursor in Spalte(x+45) & Zeile(y+5) setzen printf("Effektivzins [%%] : %2.2lf\n",effektivz); gotoxy(x + 45,y+6); //Cursor in Spalte(x+45) & Zeile(y+6) setzen printf("Laufzeit [Monate] : %2.0lf",monat); gotoxy(x ,y+11); printf("\nNeue Berechnung [Return] ->"); gets(dummy); } else { printf("weiter [Return] ->"); gets(dummy); } } return 0; }
-
printf("%3.2lf");
heißt nicht 3 Vorkomma und 2 Nachkommastellen,
sondern Mindest-Feldlänge sind 3 Zeichen (incl. Dezimalpunkt) plus 2 Nachkommastellen.
-
Danke es läuft jetzt perfekt!!!!DANKE DAKNE DANKE!!!!
-
printf mit "%lf" für double ist undefiniertes Verhalten, es heißt "%f" für float und double. Für deinen Anwendungsfall hätte wohl auch einfach
printf("%.2f",...)
ausgereicht.
-
Problem doch nicht gelöst:(
bei manchen werten treten die porbleme nicht mehr auf be anderen wieder ja:(wie bekomm ich das bloß auf zwei nachkommastellen reduziert??? hab alle tips befolgt..