Ich schreibe eine Funktion zum Konvertieren einer vom Benutzer bereitgestellten Zeichenfolge in ein Double. Es funktioniert ziemlich gut für bestimmte Werte, aber für andere nicht. Zum BeispielArithmetischer Fehler beim Konvertieren von Zeichenfolge in Double
string_to_double("123.45") = 123.45
string_to_double(12345) = 12345
aber
string_to_double(123.4567) = 123.457
bin ich ziemlich sicher, dass dies eine Art von Abrundungsfehler ist, aber ich bin mit Annäherungen nicht noch verwende ich sehr kleine oder große Werte. Meine Frage ist zweifach, warum bekomme ich diese seltsamen Ergebnisse und wie kann ich meinen Code ändern, um genauere Ergebnisse zu erhalten? Ich mache das auch als eine persönliche Herausforderung, daher sind Vorschläge zur Verwendung von Methoden wie std::stod
nicht hilfreich. Ich glaube, das Problem tritt in der zweiten for-Schleife auf, aber ich fand es ratsam, die gesamte Methode einzuschließen, denn wenn ich etwas verpasse, ist es nicht so viel zusätzlichen Code zu lesen.
My-Code
template <class T>
double numerical_descriptive_measures<T>::string_to_double(std::string user_input)
{
double numeric_value = 0;//Stores numeric value of string. Return value.
int user_input_size = user_input.size();
int power = 0;
/*This loop is for the characteristic portion of the input
once this loop finishes, we know what to multiply the
characterstic portion by(e.g. 1234 = 1*10^3 + 2*10^2 + 3*10^1 + 4)
*/
for(int i = 0;i < user_input_size;i++)
{
if(user_input[i] == '.')
break;
else
power++;
}
/*This loop is for the mantissa. If this portion is zero,
the loop doesn't execute because i will be greater than
user_input_size.*/
for(int i = 0;i < user_input_size;i++)
{
if(user_input[i] != '.')
{
numeric_value += ((double)user_input[i] - 48.0)*pow(10,power-i-1);
}
else
{
double power = -1.0;
for(int j = i+1;j < user_input_size;j++)
{
numeric_value += ((double)user_input[j] - 48.0)*pow(10.0,power);
power = power-1.0;
}
break;
}
}
return numeric_value;
}
Sind Sie sicher, dass der Wert wirklich 123,457 ist? Wie drucken Sie es? Wahrscheinlich wird die Druckfunktion gerade abgerundet. Warum erfinden Sie dieses Rad neu? –
@JohnZwinck Ich drucke die Funktion mit Std :: Cout << Daten << Std :: Endl. Dieses Problem entsteht durch eine Statistikklasse, die ich schreibe. Ich bin zu diesem Zeitpunkt nur ein kleiner Student, also je mehr Code ich habe, desto besser. Dies geschah für Input-Tests (stellen Sie sicher, dass niemand irgendwelche doof Werte wie "finde den Durchschnitt von abc") einreicht. – Dunka