我正在尝试将浮点数转换为char数组。sprintf()
不会为我工作,也不会dtostrf
。由于我的十进制数有限制(为5),因此我尝试了以下方法:
int num = f;
int decimales = (f-num)*10000;
一切正常,直到我键入了123.050。而不是给我小数部分为“ 0.50”,而是给了我5000,因为既然我的“小数”变量是,它就不算0 int
。
还有其他转换方式吗?
sprintf
由于嵌入式系统上的空间限制,您需要一种快速且肮脏的方法来生成带有浮点数的小数表示形式的字符串而无需链接。小数位数是固定的。这是一个建议:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *ftoa(char *dest, size_t size, double val, int dec) {
char *p = dest;
char *q = dest + size;
long long mul = 1;
long long num;
int i;
if (size == 0)
return NULL;
*--q = '\0';
if (size == 1)
goto fail;
if (val < 0) {
val = -val;
if (p >= q)
goto fail;
*p++ = '-';
}
for (i = 0; i < dec; i++) {
mul *= 10;
}
num = (long long)(val * mul + 0.5);
for (i = 1; i < dec + 2 || num > 0; i++) {
if (p >= q)
goto fail;
*--q = '0' + (num % 10);
num = num / 10;
if (i == dec) {
if (p >= q)
goto fail;
*--q = '.';
}
}
memmove(p, q, dest + size - q);
return dest;
fail:
return memset(dest, '*', size - 1);
}
int main(int argc, char *argv[]) {
char buf[24];
for (int i = 1; i < argc; i++) {
double d = strtod(argv[i], NULL);
int dec = 5;
if (i + 1 < argc)
dec = atoi(argv[++i]);
printf("%s\n", ftoa(buf, sizeof buf, d, dec));
}
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句