amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > gerundete Zahlen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

17.05.2003, 21:57 Uhr

KannNix!
Posts: 78
Nutzer
Hallo zusammen,

ich bräuchte mal einwenig Hilfe bei einem kleinen Programm in C.


Es soll ein Programm erstellt werden das bei der Eingabe von a=6.0 und b=1.0 x berechnet(x=b/a) und ausgibt. Ok... bis jetzt kein Problem aber nun kommt es. Ausgegeben werden soll auf dem Bildschirm 1.000 / 6.000 = 0.170 . Wobei das Ergebnis das Problem ist da auf 2 Stelle gerundet werden soll und die dritte Stelle eine Null sein muß.

Anders Beispiel : b=1.0 a=3.0 Ausgabe 1.000 / 3.000 = 0.330

... bitte um Lösungshilfen ...

[ - Antworten - Zitieren - Direktlink - ]

17.05.2003, 22:08 Uhr

KannNix!
Posts: 78
Nutzer
... achso ... bitte nicht die Lösung ...

printf("&.2f0",ergebnis);

danke ...

[ - Antworten - Zitieren - Direktlink - ]

18.05.2003, 10:14 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hmm, weiss nicht ob es eine Systemfunktion dafür gibt aber mit ein paar "hacks" dürfte es auch so gehen:

c = (int) (((a / b) * 100.0) + 0.5) / 100.0;

wobei die Beiden 100er für die Anzahl der Stellen hinter'm Komma stehen: 100 = 3, 1000 = 4, 10000 = 5 usw.

a = 1.0
b = 6.0
c = 0.170000...

gruss und hoffe geholfen zu haben.

[ Dieser Beitrag wurde von DariusBrewka am 18.05.2003 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.05.2003, 15:15 Uhr

KannNix!
Posts: 78
Nutzer
Zitat:
Original von DariusBrewka:
Hmm, weiss nicht ob es eine Systemfunktion dafür gibt aber mit ein paar "hacks" dürfte es auch so gehen:

c = (int) (((a / b) * 100.0) + 0.5) / 100.0;

wobei die Beiden 100er für die Anzahl der Stellen hinter'm Komma stehen: 100 = 3, 1000 = 4, 10000 = 5 usw.

a = 1.0
b = 6.0
c = 0.170000...

gruss und hoffe geholfen zu haben.

[ Dieser Beitrag wurde von DariusBrewka am 18.05.2003 editiert. ]



bei dieser lösung kommt es aber immer noch zu Rundungsfehlern bei mir :(

ergebnis=(((a/b)*100.0)+0.5)/100.0;
printf("%.3f",ergebnis);

würde 0.172 als Ergebnis rauskommen.

wobei man ja hier auch wieder "hacken" könnten. Einfach die printf Anweisung ändern und eine null Schreiben.

printf("%.2f0",ergebnis);

jetzt würde auch 0.170 rauskommen. Glaube aber das es zuviel "gehackt ist". Habe jetzt allerdings in der math.h die Befehle floor und ceil zum aufrunden bzw zum abrunden gefunden. Mal sehen was man damit machen kann.

bei:

ergebnis=floor(((a/b)*100.0)+0.5)/100.0;
printf("%.3f",ergebnis);

würde schonmal 0.170 rauskommen...


[ - Antworten - Zitieren - Direktlink - ]

18.05.2003, 20:00 Uhr

thomas
Posts: 7716
Nutzer

Wer lesen kann ist klar im Vorteil. Darius hat mit (int) die Nachkommastellen abgeschnitten. Das darfst du nicht weglassen.

Deine Lösung mit floor() ist vermutlich besser, denn bei dem Umweg über int muß zweimal konvertiert werden, während bei floor() vermutlich nur ein paar Bytes auf Null gesetzt werden.

x = floor(b / a * 100.0 + 50.0) / 100.0;

BTW, was stört dich an "%.2f0" ? Bei der Aufgabenstellung (zwei Nachkommastellen mit 0 dahinter) dürfte das die eleganteste Lösung sein.

Ich hätte da noch eine Lösung ohne Fließkommazahlen:

x = (b * 100 + (a >> 1)) / a;
printf ("%d.%02d0n",x/100,x%100);

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > gerundete Zahlen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.