浮点数转字符串dtostrf,自编源码,亲测可用
程序员文章站
2022-06-19 11:30:39
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar...
浮点数转字符串dtostrf,自编代码,亲测可用
最近编c语言程序,要从下位机用蓝牙上传数据,发现sprintf()函数转浮点数的时候转出来全是问号’?’。网上搜了下,发现Arduino的dtostrf函数可用,但好像在Arduino自己的库里,笔者用IAR软件往K60芯片上烧程序,用不了Arduino。所以自己写了个dtostrf,亲测可用,先上代码,有需要的自取吧:
// prints a float 'val' to string 'buf'
void dtostrf(double val, int len, int prec, char* buf, int buf_len) {
int int_count = 0;
int index = 0;
//判断正负
if (val < 0) {
buf[index] = '-';
index ++;
val = -val;
}
//先数一下整数部分长度
while ((int) val > 0) {
val /= 10.0;
int_count++;
}
while (index < len && index < buf_len) {
//如果整数部分结束
if (int_count == 0) {
//如果一上来就是0
if (index == 0) {
buf[index] = '0';
index++;
}
else {
buf[index] = '.';
index++;
int_count--;
}
}
//int_count此时已经是小数长度的相反数
else if ( int_count >= -prec) {
val *= 10.0;
buf[index] = (int)val + '0';
val -= (double)((int)val);
index++;
int_count--;
}
else break;
}
//强制加'\0'
if (index == buf_len) buf[index - 1] = '\0';
else buf[index] = '\0';
}
重要说明
参数说明:
double val:要转换的浮点类型数据
int len:输出字串最长显示长度
int prec:要求小数点精度(小数点后几位)
char* buf:要存放的字符串位置
int buf_len:字符串buf的长度
与Arduino的dtostrf不同之处:
① 在最后多加了buf_len参数,即预先创建的buf串长度,防溢出,以及字符串数组占满了没有’\0’出问题。更安全(类似sprintf_s)
②输出永远没有空格没有前导零(Arduino的dtostrf在满足精度要求但字符数量不足width时会在字符串前添加空格)
注意事项:
① 当浮点数翻译出的结果把buf占满了,程序会强制在最后加’\0’挤掉最后一位(尽量使用的时候就不要有越界风险吧~)
② 小数点也算在len的长度里!!!
③ 总长度或精度满足其一即翻译结束,例如:
dtostrf(20.1234, 6, 5, buf, 10) 会存"20.123"
dtostrf(2.5, 5, 2, buf, 10) 会存"2.50"
代码测试:
测试代码:
int main() {
char buf[10] = "aefeag";
dtostrf(2.5, 5, 2, buf, 10);
printf("%s\n", buf);
dtostrf(20.1234, 6, 3, buf, 10);
printf("%s\n", buf);
dtostrf(0.98798234, 12, 9, buf, 10);
printf("%s\n", buf);
dtostrf(32, 7, 4, buf, 10);
printf("%s\n", buf);
return 0;
}
输出结果:
语法也没有什么特别难的,想自己改也很容易~
本文地址:https://blog.csdn.net/BBBBBHY/article/details/109641537