Wieso funktioniert mein Aufrunden nicht?
-
Hi Leute,
Ich bin noch relativ neu in C++ und weiß absolut nicht was ich falsch mache bzw wie ich das Problem umgehen kann.
Aufgabe ist Fassungsvermögen n, sowie die bestellte Anzahl von Litern (Fassungsvermögen soll frei wählbar sein) einzulesen und die benötigten Fässer auszugeben.
Was mir dabei Kopfzerbrechen bereitet ist das aufrunden (was nötig ist denn z.b 1.5 Fässer sind ja trotzdem 2 Fässer). Mein Ansatz:double n, Anzahl, Aufrunder; Anzahl = Liter/n; Aufrunder = Anzahl - int(Anzahl); Aufrunder = 1-Aufrunder; cout << Anzahl + Aufrunder;Ich bekomm keine Fehlermeldung sondern nur falsche Ergebnisse also liegts vermutlich an meiner Rechnung aber für mich macht die Sinn

Ich hoffe ihr könnt mir helfen!
Cheers,
Fluegelnuss
-
// include <cmath> double roundMeUp = 1.5; double ceiling = std::ceil(roundMeUp);
-
@flügelnuss
Die Lösung hast du ja schon.Wo deine Variante versagt sind Fälle wo es sich genau ausgeht.
Also Liter = 6 und n = 3 bekommst du Anzahl = 2.0.
Dann wirdAufrundererstmal 2.0 - 2.0 = 0.0, und im zweiten Schritt wirdAufrunderdann 1.0 - 0.0 = 1.0, und dein Ergebnis ist um eins zu hoch.Wenn du auf fertige Funktionen wie
ceilverzichten willst, gibt es einen recht einfachen Weg. Und zwar erstmal einfach konvertieren (was die Nachkommastellen verwirft, bei Zahlen > 0 also abrundet), und dann, aber nur wenn nötig, eins draufaddieren.
Alsodouble n, Anzahl; long long AnzahlInt; Anzahl = Liter/n; AnzahlInt = Anzahl; if (AnzahlInt < Anzahl) AnzahlInt++; cout << AnzahlInt;
-
Alternativ auch:
AnzahlInt = Anzahl + 0.5;
-
Nathan schrieb:
Alternativ auch:
AnzahlInt = Anzahl + 0.5;Nein. Das rundet aber es rundet nicht auf.
-
asfdlol schrieb:
Nathan schrieb:
Alternativ auch:
AnzahlInt = Anzahl + 0.5;Nein. Das rundet aber es rundet nicht auf.
Stimmt, explizit Aufrunden war gefragt.
-
Genau.
Und dazu müsste man "1.0 weniger 1 ULP" draufaddieren.
Also quasilong long AnzahlInt = nextafter(Anzahl, 0) + 1.0;Wäre mir aber zu funky. Die andere Variante finde ich einfacher.
(Vor allem bin ich mir nichtmal 100% sicher ob das in allen Fällen korrekt funktioniert. Dazu müsste ich mir erstmal die genauen Regeln zu IEEE Floating-Point Berechnungen durchlesen.)