2017-02-09 2 views
0

J'ai une variable CString que je dois convertir en deuxC++ atof/_wtof, erreur d'arrondi

CString sVal(_T(" 4.2")); 
double dbl2 = _wtof(sVal); 

et je me suis dbl2 = 4,0000 au lieu de 4,2. Quelle pourrait être la raison de l'arrondissement?

+0

Pouvez-vous montrer un programme principal complet, y compris cet échantillon s'il vous plaît (et vérifier qu'il montre d'abord le problème). Idéalement, vous devriez le convertir pour utiliser standard 'std :: wstring', mais sinon, je changerais les balises pour inclure quelque chose de spécifique à MS. –

+3

Êtes-vous en Europe continentale? (En d'autres termes, votre machine est-elle configurée avec un séparateur décimal de ','?) Il se peut qu'elle effectue une transformation spécifique aux paramètres régionaux. –

+0

Russie, setlocale (LC_ALL, ".1251"); Vous avez raison, en remplaçant "." à "," éliminé le problème –

Répondre

1

point décimal est l'un des "éléments" dans la localisation

ATTENTION !!! ci-dessous le code n'est pas optimisé pour de nombreuses conversions ultérieures

#include <locale.h> 
#include <string> 

... 

CString sVal(_T(" 4.2")); 

std::string currentLocale = setlocale(LC_NUMERIC, NULL); //retrive current locale 
setlocale(LC_NUMERIC, "C"); //change numeric locale to C, now decimal separator is '.' 

double dbl2 = _wtof(sVal); 

setlocale(LC_NUMERIC, currentLocale.c_str()); //return to original locale 

Voir http://www.cplusplus.com/reference/clocale/setlocale/