Wie kann ich in C++ abrunden ohne eine Funktion zu benutzen?
Hallo!
Ich bin neu im Informatikkurs und stehe grade ziemlich auf dem Schlauch:
Ein und Ausgabe sind mir prinzipiell klar aber folgende Aufgabe erfordert mehr:
Erstellen Sie ein Jupyter Notebook, bei dem eine positive Kommazahl und eine Stellenanzahl eingelesen werden
Die Kommazahl soll dann ohne Verwendung von fertigen Rundungsfunktionen auf die eingegebene Stellenanzahl
abgerundet werden. Im Anschluss soll das Ergebnis ausgegeben werden.
Beispiel:
Bitte die zu rundende Zahl, mit Punkt statt Komma: (Eingabefeld) 4.12345
Auf wie viele Stellen soll abgerundet werden? (Eingabefeld) 3
Abgerundet auf 3 Stellen lautet die Zahl: 4.123
Anforderungen:
Einlesen einer Kommazahl und einer Stellenzahl
Abrunden auf die Stellenzahl ohne Verwendung fertiger Rundungsfunktionen
Ausgabe des Ergebnisses
3 Antworten
Also ganz primitiv und ohne Fehlerprüfung:
#include <iostream> // cout, endl
#include <cstdlib> // size_t
int main (void) {
using namespace ::std;
cout << "Enter floating point number: " << flush;
double fp {};
cin >> fp;
cout << "Enter decimal places: " << flush;
size_t dp {};
cin >> dp;
size_t factor { 1ul };
while (dp--) {
factor *= 10;
}
const auto multiplied { static_cast<size_t>(fp * factor) };
const auto before { multiplied / factor };
const auto after { multiplied % factor };
cout << "Rounded: " << before << "." << after << endl;
}
Ich habe absichtlich nicht den naiven Weg gewählt, weil man dabei gleitkomma-bedingte Rundungsfehler bekommen wird.
Und im obigen Codeschnipsel wird nicht auf Plausibilität und Fehler geprüft. (negative Eingabe, 0 als Dezimalstellen, etc.)
Ach und, du brauchst dafür einen modernen Compiler, der C++17 kennt, da ich die moderne Art der Initialisierung verwende. Falls du das nicht magst, kannst du es ja auch noch anpassen.
Du könntest die Zahl in einen String verwandeln, ab hier sollte der Weg klar sein.
Du könntest Di Zahl mit 10^Stellen multiplizieren, einen Integralcast machen und dann wieder dividieren.
Ggf. gibt es noch weitere Möglichkeiten.
Du kannst die Eingabe in einzelne Zeichen/Chars zerlegen, und diese dann verändern wenn gerundet werden muss
Wie zerlege ich die denn? Das ist vielleicht einfacher als die Multiplikation (wie in der vorher genannten Antwort) ggf mehrmals durchzuführen