Comment puis-je convertir une valeur float
en char*
en C
langue?
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 suffisamment grande pour la contenir.
snprintf
est une meilleure option que sprintf
car il garantit qu'il n'écrira jamais au-delà de la taille du tampon que vous fournissez 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);
Longtemps après accepter la réponse.
Utilisez sprintf()
, ou des fonctions connexes, comme beaucoup d'autres ont suggéré des réponses, mais utilisez un meilleur spécificateur de format.
En utilisant "%.*e"
, Le code résout divers problèmes:
La taille maximale du tampon nécessaire est beaucoup plus raisonnable, comme 18. sprintf(buf, "%f", FLT_MAX);
pourrait avoir besoin de 47+. 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 la plus haute float
. Pour les détails, voir spécificateur de largeur Printf pour maintenir la précision de la valeur à virgule flottante
L'utilisation de "%e"
Permet au code de distinguer les petits float
les uns des autres plutôt que toutes les impressions "0.000000"
Qui est le résultat lorsque |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 vaut mieux utiliser une taille de tampon 2x pour les blocs-notes comme buf[FLT_STRING_SIZE*2]
.
Pour plus de robustesse, utilisez snprintf()
.
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 à la valeur flottante des données octet par octet et l'envoyer via un tampon de sortie 8 bits (par exemple USART) sans transtypage.
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);