amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > gerundete Zahlen [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2003-05-17, 21:57 h

KannNix!
Posts: 78
User
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 ...

[ - Answer - Quote - Direct link - ]

2003-05-17, 22:08 h

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

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

danke ...

[ - Answer - Quote - Direct link - ]

2003-05-18, 10:14 h

DariusBrewka
Posts: 899
[Banned user]
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. ]

[ - Answer - Quote - Direct link - ]

2003-05-18, 15:15 h

KannNix!
Posts: 78
User
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...


[ - Answer - Quote - Direct link - ]

2003-05-18, 20:00 h

thomas
Posts: 7718
User

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/

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > gerundete Zahlen [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.