Conversion de float en char *

Comment convertir une valeur float en char* en langage C ?

 char buffer[64]; int ret = snprintf(buffer, sizeof buffer, "%f", myFloat); if (ret < 0) { return EXIT_FAILURE; } if (ret >= sizeof buffer) { /* Result was truncated - resize the buffer and retry. } 

Cela stockera la représentation sous forme de chaîne de myFloat dans myCharPointer . Assurez-vous cependant que la chaîne est assez grosse pour la tenir.

snprintf est une meilleure option que sprintf car elle garantit qu’elle n’écrira jamais au-delà de la taille du tampon fourni dans l’argument 2.

 char array[10]; sprintf(array, "%f", 3.123); 

sprintf : (à partir de MSDN)

En Arduino:

 //temporarily holds data from vals char charVal[10]; //4 is mininum width, 3 is precision; float value is copied onto buff dtostrf(123.234, 4, 3, charVal); monitor.print("charVal: "); monitor.println(charVal); 
 char* str=NULL; int len = asprintf(&str, "%g", float_var); if (len == -1) fprintf(stderr, "Error converting float: %m\n"); else printf("float is %s\n", str); free(str); 
 typedef union{ float a; char b[4]; } my_union_t; 

Vous pouvez accéder aux valeurs de données flottantes octet par octet et les envoyer via un tampon de sortie 8 bits (par exemple, USART) sans transtypage.

Longtemps après accepter la réponse.

Utilisez sprintf() , ou des fonctions connexes, comme beaucoup d’autres ont des réponses suggérées, mais utilisez un meilleur spécificateur de format.

En utilisant "%.*e" , le code résout divers problèmes:

  • La taille maximale de la mémoire tampon nécessaire est beaucoup plus raisonnable, comme 18. sprintf(buf, "%f", FLT_MAX); pourrait avoir besoin de 47 ans et plus. sprintf(buf, "%f", DBL_MAX); peut avoir besoin de 317+

  • L’utilisation de ".*" Permet au code de définir le nombre de décimales nécessaires pour distinguer une version chaîne de float x et sa prochaine plus grande valeur float . Pour les conditions, voir Spécificateur de largeur Printf pour conserver la précision de la valeur en virgule flottante.

  • L’utilisation de "%e" permet au code de distinguer les petits float les uns des autres plutôt que de "0.000000" ce qui est le résultat lorsque |x| < 0.0000005 |x| < 0.0000005 .

     #define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4 +1) // - d . dddddddd e - dddd \0 char buf[FLT_STRING_SIZE]; sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float); 

Idées:
IMO, il est préférable d’utiliser une taille de tampon 2x pour les blocs de travail comme buf[FLT_STRING_SIZE*2] .
Pour plus de robustesse, utilisez snprintf() .

 char array[10]; snprintf(array, sizeof(array), "%f", 3.333333);