将浮点数转换为char*

23

如何在 C 语言中将 float 值转换为 char* 类型?


11
请具体说明您需要什么 - 浮点数的十进制文本表示?还是一串字节,可以轻松传递并用于稍后重新构建浮点数?请更明确地表达您的需求。 - crazyscot
9个回答

43
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中。但要确保字符串足够大。

snprintfsprintf更好,因为它保证不会写入超出第二个参数所提供的缓冲区大小的内容。


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

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

sprintf:(来自MSDN)


@aJ 当值在缓冲区中打印时,同样的打印语句是否也会在控制台上打印出来? - boom
sprintf会将浮点值写入缓冲区。如果您想将其打印到控制台,请使用printf(“%f”... - aJ.

10

接受答案之后很久。

使用sprintf()或其他相关函数,如其他回答所建议的,但使用更好的格式说明符。

使用"%.*e",代码可以解决各种问题:

  • 使用"%.*e",需要的最大缓冲区大小更加合理,例如对于float(参见下文),只需要18个字符。使用"%f"(考虑定点数),sprintf(buf, "%f", FLT_MAX);可能需要47个或更多字符。sprintf(buf, "%f", DBL_MAX);可能需要317个或更多字符。

  • 使用".*"允许代码定义需要区分float x及其下一个最高float的小数位数。有关详细信息,请参见printf width specifier to maintain precision of floating-point value

  • 使用"%e"允许代码区分彼此之间较小的float,而不是所有都打印"0.000000",这是在"%f"中当|x| < 0.0000005时的结果。

示例用法:

#include <float.h>
#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);

建议:
在像 buf[FLT_STRING_SIZE*2] 这样的暂存区中,建议使用 2 倍的缓冲区大小。
为了增加鲁棒性,建议使用 snprintf()


第二种备选方案是考虑使用 "%.*g"。它类似于对值接近 1.0 的指数形式使用 "%f",对其他值使用 "%e"


2
typedef union{
    float a;
    char b[4];
} my_union_t;

您可以通过逐字节访问浮点数据值,并将其通过8位输出缓冲区(例如USART)发送,而无需进行强制转换。


更新:不要忘记处理器的字节序! - Peter
1
在这个联合中,对于数组来说,使用“unsigned char”类型是非常建议的。 - chqrlie
是的。我使用uint8_t。顺便说一下,最简单(但不安全)的方法就是强制转换指针^^ - Peter

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

2
即使必须指定它是 GNU 扩展,我仍然会给它加上 +1(我的意思是 asprintf 是 GNU 扩展)。 - ShinTakezou

0
// float arr to bytes
int arr_len = 3;
float x[3] = {1.123, 2.123, 3.123};
char* bytes = new char[arr_len * sizeof(float)];
memcpy(bytes, x, arr_len * sizeof(float));

// bytes to float arr
float y[3];
memcpy(y, bytes, arr_len * sizeof(float));

2
请提供更多支持您答案的信息。 - Michael M.

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

-1

通过ASCII码将浮点数转换为二进制

float u = 2.154328
string s = to_string(u);
char* p = (char*) s;

这个存储了字符2, .,1, 5, ..., 或者二进制表示 00000010,00101110, 00000001, ...


1
这不是 C - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接