View Full Version : [C++/C] come convertire da stringa a float
Ciao a tutti,
sto cercando un modo per convertire da una stringa del tipo:
char str[50];
contenente il valore = "43.94394"
in float.
Cercando in cplusplus.com ho trovato solo la fonzione atof che converte una stringa in double, ma purtroppo non fa a caso mio. :muro:
Grazie a tutti!
ilsensine
21-10-2005, 18:05
Come mai non fa al caso tuo?
Come mai non fa al caso tuo?
Ho espresso male la domanda :D
Perche' converte in un float avente solo 7 cifre.
26.55656565656556 -> 26.5565
Io cercavo una funzione che convertisse fino a 20 o + cifre..
pertanto avrei bisogno di lavorare con double o long double..
c'e' qualcosa che potrei usare? ho visto che esiste atod ma non so in che libreria e'..
grazie!
em se non erro.. non picchiare se sbaglio :D
dovresti fare una cosa del genere:
float numero;
numero = (float) str;
cosi dovrebbe andare.. pero non ti assicuro niente ;)
em se non erro.. non picchiare se sbaglio :D
dovresti fare una cosa del genere:
float numero;
numero = (float) str;
cosi dovrebbe andare.. pero non ti assicuro niente ;)
in effetti una conversione cast penso che vada bene, poi ovviamente sono solo al mio primo anno di programmazione quindi potrei sbagliarmi :P
float numero;
numero = (float) str;
no, non puoi fare una cosa del genere.
non riesce nemmeno a compilare.
ciao!
Io per queste cose uso le stringstream:
stringstream str;
double numeroDouble;
str << stringaNumero;
str >> numeroDouble;
Attenzione che non tutti i numeri sono rappresentabili in double...può benissimo essere che il numero convertito non sia identico a quello originale, ma magari scartare di qualche millesimo di punto percentuale... Ma questo è normale...visto che l'insieme dei numeri rappresentabili con i double non è continuo...
ilsensine
22-10-2005, 11:30
Ho espresso male la domanda :D
Perche' converte in un float avente solo 7 cifre.
26.55656565656556 -> 26.5565
Io cercavo una funzione che convertisse fino a 20 o + cifre..
pertanto avrei bisogno di lavorare con double o long double..
atof converte in double, quindi non è lei il problema.
nb se ti serve long double, usa strtold (è standard C99, ma essendo una funzione e non un costrutto dovrebbe essere utilizzabile anche nei programmi c++ se le tue librerie c la contengono).
Io per queste cose uso le stringstream:
stringstream str;
double numeroDouble;
str << stringaNumero;
str >> numeroDouble;
Attenzione che non tutti i numeri sono rappresentabili in double...può benissimo essere che il numero convertito non sia identico a quello originale, ma magari scartare di qualche millesimo di punto percentuale... Ma questo è normale...visto che l'insieme dei numeri rappresentabili con i double non è continuo...
Ho provato cosi:
"332.3232323232" >> numerodouble;
e successivamente:
stringa >> numerodouble;
Mi in entrambi i casi da un errore di compilazione -> error: invalid operands of types `const
Perchè non hai fatto come ti ho detto io...
stringstream str;
double numeroDouble;
str << "332.3232323232";
str >> numeroDouble;
Perchè non hai fatto come ti ho detto io...
stringstream str;
double numeroDouble;
str << "332.3232323232";
str >> numeroDouble;
Hai ragione, ora funziona.
Ma usando il seguente codice:
int j=0;
char tmpstring[50];
do{
c=fgetc(msmFile);
tmpstring[j]=c;
j++;
}while(c!='\n' && c!=' ');
stringstream str;
str << tmpstring;
cout << "Stringa: " << tmpstring << endl;
str >> pepMass;
cout << "Value: " << pepMass << endl;
Il valore convertito perde di precisione infatti l'output risulta:
Stringa: 35.231174769868
Value: 35.2312
Cosa sto sbagliando?
Thanks!
atof converte in double, quindi non è lei il problema.
nb se ti serve long double, usa strtold (è standard C99, ma essendo una funzione e non un costrutto dovrebbe essere utilizzabile anche nei programmi c++ se le tue librerie c la contengono).
Non capisco bene come usare questa funzione.
Se ho una stringa contenente un float, e un double su cui salvare il valore convertito, che parametri devo specificare dato che strtold ne richiede 2 ed entrambi sono puntatori a char?
Dalla man guide:
long double strtold(const char*nptr,char **endptr);
Perchè non hai fatto come ti ho detto io...
stringstream str;
double numeroDouble;
str << "332.3232323232";
str >> numeroDouble;
Prova con questo codice:
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <sstream>
int main ()
{
stringstream str;
double numeroDouble;
str << "332.3232323232";
str >> numeroDouble;
cout << numeroDouble << endl;
char c[40];
c[0]='0';
c[1]='.';
c[2]='0';
c[3]='2';
c[4]='3';
c[5]='4';
c[6]='5';
c[7]='6';
c[8]='0';
c[9]='4';
c[10]='3';
c[11]='4';
c[12]='5';
c[13]='6';
c[14]='0';
c[15]='4';
c[16]='3';
c[17]='4';
c[18]='5';
c[19]='6';
c[20]='0';
c[21]='4';
cout << c << endl;
stringstream ss;
ss << c;
ss >> numeroDouble;
cout << numeroDouble << endl;
return 0;
}
L'output che mi risulta è:
332.323
0.02345604345604345604ÿ¿x@èÃ@üo@,ä@Ð
0.023456
Che purtroppo viene troncato alla 7^ cifra, come se fosse un float.
Non ci capisco + nulla! :muro:
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;
int main(void)
{
string str;
cin >> str;
istringstream is(str);
double d;
is >> d;
cout << "String: " << str << "\n";
cout << "Double: " << setprecision(14) << d << endl;
}
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;
int main(void)
{
string str;
cin >> str;
istringstream is(str);
double d;
is >> d;
cout << "String: " << str << "\n";
cout << "Double: " << setprecision(14) << d << endl;
}
Grande!!!! Ora funziona!! Mi hai fatto un gran favore con questo aiuto!!
Dove hai trovato queste info?
Come sarebbe dove le hai trovate? Io queste cose le so.
:Prrr:
Come sarebbe dove le hai trovate? Io queste cose le so.
:Prrr:
Eh eh, certo che le sai :D , ti domandavo pero' se hai qualche link o simili per potermi documentare io.
ilsensine
22-10-2005, 16:23
Non capisco bene come usare questa funzione
long double val = strtold("1.2345", NULL);
Se ho una stringa contenente un float, e un double su cui salvare il valore convertito, che parametri devo specificare dato che strtold ne richiede 2 ed entrambi sono puntatori a char?
Se ti serve un "double" come risultato, è inutile usare la strtold -- è sufficiente la atof.
atof converte in _double_, non in float. Non so cosa si è fumato chi ha generato il nome, la "f" finale sta forse per "fumato" non per "float" :D
long double val = strtold("1.2345", NULL);
Se ti serve un "double" come risultato, è inutile usare la strtold -- è sufficiente la atof.
atof converte in _double_, non in float. Non so cosa si è fumato chi ha generato il nome, la "f" finale sta forse per "fumato" non per "float" :D
eh eh! Thank you!
:)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.