C语言 将浮点数转换为字符数 *

ovfsdjhp  于 2023-02-11  发布在  其他
关注(0)|答案(9)|浏览(154)

如何将float值转换为C中的char*

jhdbpxl9

jhdbpxl91#

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中提供的缓冲区大小。

2ic8powd

2ic8powd2#

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

cu6pst1q3#

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

sprintf:(来自MSDN)

fiei3ece

fiei3ece4#

很久以后才接受答案。
使用sprintf()或相关函数,就像许多其他人建议的那样,但要使用更好的格式说明符。
使用"%.*e",代码可以解决各种问题:

  • 对于"%.*e",所需的最大缓冲区大小要合理得多,比如float为18(见下文)。对于"%f",(考虑 * 定点 *),sprintf(buf, "%f", FLT_MAX);可能需要47+ charsprintf(buf, "%f", DBL_MAX);可能需要317+ char
  • 使用".*"允许代码定义区分float x的字符串版本及其下一个最高版本float所需的小数位数。有关详细信息,请参见printf width specifier to maintain precision of floating-point value
  • 使用"%e"允许代码将小float彼此区分开,而不是将|x| < 0.0000005"%f"一起打印时的结果全部打印"0.000000"

示例用法:

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

想法:
IMO,对于buf[FLT_STRING_SIZE*2]这样的便笺簿,最好使用2倍的缓冲区大小。
为了增加稳健性,请使用snprintf()
作为第二种选择,考虑"%.*g",它类似于"%f",对于指数接近1.0的值,类似于"%e",对于其他值,类似于"%e"

a7qyws3x

a7qyws3x5#

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

omqzjyyz6#

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

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

t3irkdon

t3irkdon7#

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

w8f9ii698#

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

cgyqldqp9#

通过ascii代码将浮点转换为二进制

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

它存储字符2、...、1、5、...或二进制的00000010、00101110、0000001、...

相关问题