float to string nachbauen
-
Hi,
ich habe einen kleinen task gecoded:
ich weiss das 7.64 nicht als floating point representiert werden kann...aber warum bekomme ich 7.995886933 als ergebnis?/*Question:
Given a float number 7.64, convert it into the string WITHOUT using any inbuilt function/library.
for eg:
input
float no.: 7.64
output
string: 7.64
*/template <class T>
string to_string(T &t)
{
stringstream ss;
ss << t;
return ss.str();
}string float_to_string(float val) {
int integral = static_cast<int>(val);
int fractional = 0;val = val - integral;
while(val > 0) {
val = val * 10;
fractional = (fractional * 10) + static_cast<int>(val);
val = val - static_cast<int>(val);
}string str = to_string<int>(integral) + '.' + to_string<int>(fractional);
return str;
}int main() {
cout << float_to_string(7.64) << endl;
}
-
Dein Code formatiert und in Tags...
#include <iostream> #include <string> #include <sstream> using namespace std; template <class T> string to_string(T &t) { stringstream ss; ss << t; return ss.str(); } string float_to_string(float val) { int integral = static_cast<int>(val); int fractional = 0; val -= integral; while(val > 0) { val *= 10; fractional = (fractional * 10) + static_cast<int>(val); val -= static_cast<int>(val); } string str = to_string<int>(integral) + '.' + to_string<int>(fractional); return str; } int main() { cout << float_to_string(7.64) << endl; }
-
aber warum bekomme ich 7.995886933 als ergebnis?
Weil Fließkommazahlen anders funktionieren als du denkst. Die Standardausgabe gibt Fließkommazahlen immer nur bis zu einer bestimmten vorgegebenen Präzision aus - es ist nämlich völlig Unsinnig, alle Ziffern der gespeicherten Fließkommazahl auszugeben.
Versuche also, deine
to_string
Funktion nur zwei Nachkommastellen ausgeben zu lassen. Oder die Schleife nur maximal fünf Durchlaufe zu lassen. Da bekomme ich schon7.6399
.
-
soll der user die anzahl der nachkomma-stellen angeben?
-
also:
#include <iostream> #include <string> #include <sstream> using namespace std; template <class T> string to_string(T &t) { stringstream ss; ss << t; return ss.str(); } string float_to_string(float val, int n) { int integral = static_cast<int>(val); int fractional = 0; val -= integral; while(val > 0 && n > 0) { val *= 10; fractional = (fractional * 10) + static_cast<int>(val); val -= static_cast<int>(val); n--; } string str = to_string<int>(integral) + '.' + to_string<int>(fractional); return str; } int main() { cout << float_to_string(7.64, 4) << endl; }