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..


Anmelden zum Antworten