60 votes

Comment convertir une chaîne en flottant ?

#include
#include

int main() 
{
    char s[100] ="4.0800" ; 

    printf("valeur flottante : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}

Je m'attends à ce que la sortie soit 4.08000000 alors que je n'ai eu que 4.00000000.

Existe-t-il un moyen d'obtenir les chiffres après le point ?

75voto

Mysticial Points 180300

Utilisez atof() ou strtof() à la place :

printf("valeur float : %4.8f\n" ,atof(s)); 
printf("valeur float : %4.8f\n" ,strtof(s, NULL)); 

https://cplusplus.com/reference/cstdlib/atof/
https://cplusplus.com/reference/cstdlib/strtof/

  • atoll() est destiné aux entiers.
  • atof()/strtof() est pour les flottants.

La raison pour laquelle vous obtenez uniquement 4.00 avec atoll() est parce qu'il arrête l'analyse lorsqu'il trouve le premier caractère non-chiffre.

*Notez que strtof() nécessite C99 ou C++11.

37voto

Sam Hocevar Points 7554

Malheureusement, il n'y a pas de moyen de le faire facilement. Chaque solution a ses inconvénients.

  1. Utilisez atof() ou strtof() directement : c'est ce que la plupart des gens vous diront de faire et cela fonctionnera la plupart du temps. Cependant, si le programme définit une locale ou utilise une bibliothèque qui définit la locale (par exemple, une bibliothèque graphique qui affiche des menus localisés) et que l'utilisateur a sa locale définie dans une langue où le séparateur décimal n'est pas . (comme fr_FR où le séparateur est ,), ces fonctions s'arrêteront d'analyser à . et vous obtiendrez toujours 4.0.

  2. Utilisez atof() ou strtof() mais changez la locale ; il suffit d'appeler setlocale(LC_ALL|~LC_NUMERIC, ""); avant tout appel à atof() ou équivalent. Le problème avec setlocale est qu'il sera global pour le processus et vous pourriez interférer avec le reste du programme. Notez que vous pouvez consulter la locale actuelle avec setlocale() et la restaurer une fois que vous avez terminé.

  3. Écrivez votre propre routine d'analyse des flottants. Cela peut être assez rapide si vous n'avez pas besoin de fonctionnalités avancées telles que l'analyse des exposants ou des flottants hexadécimaux.

De plus, notez que la valeur 4.08 ne peut pas être représentée exactement comme un flottant ; la valeur réelle que vous obtiendrez est 4.0799999237060546875.

29voto

user1336087 Points 2202

Pourquoi ne pas utiliser la fonction atof() pour convertir une chaîne en double?

En cas de succès, la fonction atof() renvoie le nombre flottant converti en tant que valeur double. Si aucune conversion valide n'a pu être effectuée, la fonction renvoie zéro (0.0). Si la valeur convertie se trouve en dehors de la plage des valeurs représentables par un double, cela provoque un comportement indéfini.

Référence : http://www.cplusplus.com/reference/cstdlib/atof/

Utilisez plutôt la fonction strtod(), elle est plus robuste.

Essayez ce code :

#include
#include
#include
int main()
{
    char s[100] = "4.0800";
    printf("Valeur en virgule flottante : %4.8f\n",strtod(s,NULL));
    return 0;
}

Vous obtiendrez la sortie suivante :

Valeur en virgule flottante : 4.08000000

5voto

Luchian Grigore Points 136646

Utilisez atof()

Mais ceci est obsolète, utilisez plutôt ceci :

const char* flt = "4.0800";
float f;
sscanf(flt, "%f", &f);

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

atof() retourne 0 à la fois en cas d'échec et lors de la conversion de 0.0, il est préférable de ne pas l'utiliser.

2 votes

Suggérer sscanf() à la place n'est pas meilleur. Je suggérerais plutôt strtod().

1 votes

Printf("valeur de flottant : %4.8f\n" , atof(s)); # sortie : valeur de flottant : 0.00000000

0 votes

"Utilisez atof() mais cette fonction est obsolète," --> veuillez indiquer une référence.

1voto

Rappel: Lorsque vous utilisez atof(), assurez-vous que votre chaîne de caractères ne contient pas de "". atof("1.123") renverra 0.000 ou quelque chose du genre.

Solution

str_val[0] = "0";
str_val[len-1] = "\n"; //len = longueur de la chaîne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X