Как преобразовать значение float
в char*
в C
языке?
Преобразование float в char *
Ответ 1
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.
}
Это сохранит строковое представление myFloat
в myCharPointer
. Убедитесь, что строка достаточно большая, чтобы удерживать ее.
snprintf
- лучший вариант, чем sprintf
, поскольку он гарантирует, что он никогда не будет писать за размером буфера, который вы поставили в аргументе 2.
Ответ 2
char array[10];
sprintf(array, "%f", 3.123);
sprintf: (из MSDN)
Ответ 3
в 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);
Ответ 4
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);
Ответ 5
typedef union{
float a;
char b[4];
} my_union_t;
Вы можете получить доступ к байту байта данных по байту за байтом и отправить его через 8-битный выходной буфер (например, USART) без кастования.
Ответ 6
Длинный ответ после ответа.
Используйте sprintf()
или связанные функции, так как многие другие имеют ответы, но используйте более подробный спецификатор формата.
Используя "%.*e"
, код решает различные проблемы:
-
Максимальный размер буфера гораздо более разумный, например 18.
sprintf(buf, "%f", FLT_MAX);
может понадобиться 47+.sprintf(buf, "%f", DBL_MAX);
может потребоваться 317 + -
Использование
".*"
позволяет коду определять количество десятичных знаков, необходимых для различения строковой версииfloat x
, а затем - самой высокойfloat
. Для deatils см. Спецификатор ширины печатиf для поддержания точности значения с плавающей запятой -
Использование
"%e"
позволяет коду различать маленькиеfloat
друг от друга, а не всю печать"0.000000"
, которая является результатом, когда|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);
Идеи:
IMO, лучше использовать 2x размер буфера для царапин, как buf[FLT_STRING_SIZE*2]
.
Для повышения надежности используйте snprint()
.
Ответ 7
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);