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.010Hier gibt es einen Fehler:
(0.0001,5) => 0.000105Ich 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); }