Runden von FLOAT Werten

Gast #280805
Lesenswert?

@all,

ich versuche float Werte zu runden also auf bzw. abrunden und dann als
Integer zu speichern.
Habe schon einiges versucht aber irgentwie komme ich nicht auf einen
Lösungsansatz.
Hier noch ein paar Beispiele:

54.6547 --> 55
54.4357 --> 54

also so wie ein Taschenrechner ab 5 aufrunden darunter abrunden.

Danke schon mal !!!!!!!:-)

TOM
Gast #280807
Lesenswert?

@ Horst-Otto,

habe Deine Antwort erst als Scherz gesehen, jedoch nach einigen
Gedanken gängen musse ich feststellen das man manchmal einfach nicht
auf die einfachsten Dinge kommt.

Danke für den Denkanstoss.
Gast #280809
Lesenswert?

@ Peter,

ich habe es bereit in eine funktion geschrieben die pos. und neg.
Zahlen  berücksichtigt.

int Runden(float x)
{
  int y;
  if(x>0)
  {
    x=x+0.5;
  }
  else
  {
    x=x-0.5;
  }
  y=x;
  return y;
}

Ist dies richtig ?!?!?

Danke an alle!!!!!!

TOM
Gast #280815
Lesenswert?

@ all,

Danke für die zahlreichen antworten.
Wenn ich Eure Beispiele sehe muss ich mich für meinen 10zeiler ja fast
in der Ecke verkriechen :-).
Bin leider noch nicht so fitt da ich mich erst seit neusen mit
Controllern beschäftige.
Aber auf alle Fälle habe ich anhand Eurer Syntax mal wieder was
dazugelernt.

DAMKE !!!!!!!!!!!!!

TOM
Gast #280816
Lesenswert?

Naja, wenn Du einmal scharf nachdenkst, solltest du x,5 nicht immer
generell aufrunden oder abrunden, sondern abwechselnd auf- oder
abrunden. Am besten bei x,5 immer zur nächsten geraden Zahl runden.
Erst dann rundest Du mathematisch/statistisch korrekt.

Das ganze nennt sich dann "round to even" oder "banker's
rounding".
Gast #280817
Lesenswert?

mit floor habe ich auch gerade was probiert, ist in <math.h> definiert.
floor gibt aber einen double-Wert zurück.
Ganz korrekt müsste es mit type-casting

y=(integer)(floor(x+0.5))

heißen, dafür kann man gleich

y=(integer)(x+0.5)

schreiben. Das type-casting macht der Compiler meist automatisch.

Die Frage ist, ob man das ganze nicht auch mit Integern lösen kann,
wenn man z.b. die "Auflösung" gleich höher ansetzt.
z.B. muss ich gerade die Periodendauer eines Timers ausrechnen.
timer = TIMERFREQ / freq;         //z.B. 5000000 / 5000

Dafür schreibe ich
timer = 10 * TIMERFREQ / freq10;  //z.B. 50000000 / 50000
freq10 ist die gewünschte Frequenz in Zehntel-Hertz.

So spare ich den ganzen float-Kram.
Es muss nicht unbedingt zehntel sein, es gehen auch "gerade" Werte
wie 8tel oder 256stel.

Bei 256stel bedeutet das, ich habe ein Byte nach dem Komma.
Wenn ich dann runden will, zähle ich 1 auf den Vorkomma-Teil, wenn im
Nachkomma-Byte das höchste Bit gesetzt ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren