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.
}
//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);
9条答案
按热度按时间jhdbpxl91#
这将把
myFloat
的字符串表示存储在myCharPointer
中,但要确保该字符串足够大以容纳它。snprintf
是比sprintf
更好的选项,因为它可以保证写入的内容永远不会超过您在参数2中提供的缓冲区大小。2ic8powd2#
在Arduino:
cu6pst1q3#
sprintf:(来自MSDN)
fiei3ece4#
很久以后才接受答案。
使用
sprintf()
或相关函数,就像许多其他人建议的那样,但要使用更好的格式说明符。使用
"%.*e"
,代码可以解决各种问题:"%.*e"
,所需的最大缓冲区大小要合理得多,比如float
为18(见下文)。对于"%f"
,(考虑 * 定点 *),sprintf(buf, "%f", FLT_MAX);
可能需要47+char
。sprintf(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"
。示例用法:
想法:
IMO,对于
buf[FLT_STRING_SIZE*2]
这样的便笺簿,最好使用2倍的缓冲区大小。为了增加稳健性,请使用
snprintf()
。作为第二种选择,考虑
"%.*g"
,它类似于"%f"
,对于指数接近1.0的值,类似于"%e"
,对于其他值,类似于"%e"
。a7qyws3x5#
omqzjyyz6#
您可以逐字节访问浮点数据值,并通过8位输出缓冲区(例如USART)发送,而无需强制转换。
t3irkdon7#
w8f9ii698#
cgyqldqp9#
通过ascii代码将浮点转换为二进制
它存储字符2、...、1、5、...或二进制的00000010、00101110、0000001、...