float runden als Faktor von float



  • Hallo zusammen,

    ich versuche eine Diagrambeschriftung ähnlich der von Excel-Diagrammen zu entwickeln.
    Zahlen sollen durch folgende Funktion auf einen Faktor gerundet werden:

    long double OrdinateMax(long double Wert, long double Faktor){
    	int potenz=log10(fabs(Wert));
    	if(Wert<1.0){
    		potenz--;
    	}
    	return ceil(Wert/(Faktor*pow(10, potenz-1)))*(Faktor*pow(10, potenz-1));
    }
    

    Das funktioniert für folgende Eingaben:
    (123,5) => 150
    (12.3,5) => 15
    (0.0123,5) => 0.015
    (0.0100,5) => 0.010

    Hier gibt es einen Fehler:
    (0.0001,5) => 0.000105

    Ich fürchte mein Ansatz ist zu kompliziert 😞

    Jemand eine einfachere Idee?

    Vielen Dank!



  • Ich würd einfach sagen =ceil(wert/faktor)*faktor.



  • roflo schrieb:

    Ich würd einfach sagen =ceil(wert/faktor)*faktor.

    ... danke, das funktioniert aber nur wenn der Faktor konstant ist.
    Der Faktor soll sich aber abhängig von der Größenordnung ändern:

    ...
    0,05
    0,5
    5
    50
    ...



  • mehr schlecht als recht 😕

    long double OrdinateMax(long double Wert, long double Faktor){
    	//  Faktor:	0.1  0.2  0.5  1.0
    	int Potenz=log10(fabs(Wert));
    	if(Wert<1.0){
    		Potenz--;
    	}
    	long double out= ceil(Wert/(Faktor*pow(10, Potenz)))*(Faktor*pow(10, Potenz));
    	AnsiString outStr=FloatToStrF(out,ffGeneral,2,2);
    	return StrToFloat(outStr);
    }
    


  • Vorzeichen vergessen. So, mir reichts 🙂

    long double OrdinateMax(long double Wert, long double Faktor){
    	// Faktor 0.1 0.2 0.5 1.0 1.2 2.0
    
    	int sign=1.0; // Vorzeichen speichern
    	if(Wert<0){
    		sign=-1.0;
    		Wert*=-1.0;
    	}
    
    	int Potenz=log10(fabs(Wert)); // Grössenordnung ermitteln
    	if(Wert<1.0){
    		Potenz--;
    	}
    
    	// Ausgabe formatieren
    	long double out=ceil(Wert/(Faktor*pow(10, Potenz)))*(Faktor*pow(10, Potenz));
    	// Ausgabe bereinigen (sonst Fehler bei Wert=0.0001, Faktor=0.5)
    	AnsiString outStr=FloatToStrF(sign*out, ffGeneral, 2, 2);
    	return StrToFloat(outStr);
    }
    

Anmelden zum Antworten