Преобразование float в char *

Как преобразовать значение float в char* в C языке?

Ответ 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);