Float-Variable soll weniger Kommastellen haben.

mstangl

Grünschnabel
Das Problem vor dem ich bei meinem kleinen Programmierprojekt stehe klingt zwar sehr simpel, doch ist es für mich nicht trotzdem nicht lösbar (ich bin jedoch auch kein erfahrener Programmierer und vermute dass mir ein solcher sicher helfen kann).

Eine normale mathematische Berechnung liefert als Ergebniss eine Float-Zahl. Diese Float-Variable hat sehr viele Kommastellen (somit eine hohe Genauigkeit). Um die Float-Variable jedoch in meinem Programm weiterverwenden zu können (für weitere Berechnungen), darf sie nur eine Genauigkeit von 2 oder 3 Kommastellen haben. Das heißt also, das Ergebniss der Berechnung sollte auf 2 bzw. 3 Kommastellen (kaufmännisch) gerundet werden. Wie kann ich dies erreichen?

Als Programmierumgebung verwende ich Visual C++ 6.0, und bei meinem Projekt handelt es sich um ein MFC-Programm (Microsoft Foundation Classes).

Bitte um Hilfe. Danke im Voraus
Matthias
 
Hi folgende Funktion sollte es tun:

Code:
double round_double(double toRound, int prec){

        long mult = 1;
        
        for(int i = 1; i <= prec; i++) 
                mult *= 10;
        
        return ((long)((toRound * mult) + 0.5) / (double)mult);
}

Wobei toRound der zu rundende Wert ist, und precision die Nachkommastellen auf die
du gerundet haben willst:

round_double(1.5, 0) ergibt 2
round_double(1.4, 0) ergibt 1
round_double(1.05, 1) ergibt 1.1
round_double(1.04, 1) ergibt 1
round_double(1.1501, 1) ergibt 1.2

usw usf...

Gruß

RedWing
 
du multiplizierst die Floatzahl mit 100 (für 2 Nachkommastellen) holst dir den vorkommawert dieser zahl und teilst sie wieder durch 100.

also:
float meineZahl = 1.3343432E5
double d = 0.0;
modf(meineZahl*100+0.005, &d);
meineZahl = float(d/100);

so geht's im Prinzip. Beachten musst du beim kaufmännsichen runden bestimmt noch mehr. Aber das weisst du sicher selbst besser als ich.

modf ist in <math.h>

Wenn du aber wirklich kaufmännisch damit arbeiten musst, solltest du von Haus aus keine float/double Zahlen nehmen, da es dort immer zu Rundungsfehlern kommt (wegen Dezimal - Dual).
Dann solltest du dir einen eigenen Zahlentyp erstellen (eine Klasse). Aber wahrscheinlich gibts sowas auch irgendwo im Internet verfügbar.
 
@RedWing

Wenn du einen float in einen long konvertierst, hast du das Problem, dass float einen grösseren Wertebereich umfasst als long.
 
Uups daanke für den Hinweis,
hab die Funktion auf deinen Vorschlag abgeändert:

Code:
double round_double(double toRound, int prec){

        double d;
        long mult = 1;
        
        for(int i = 1; i <= prec; i++) 
                mult *= 10;
        
        modf((toRound * mult) + 0.5, &d);
        return (d ) / mult;
}

Gruß

RedWing
 

Neue Beiträge

Zurück