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);