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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.