我正在尝试将浮点数转换为char数组。
sprintf()
对我不起作用,dtostrf
也不适合我。
由于我的十进制数有限制(为5),因此我尝试了以下方法:
int num = f;
int decimales = (f-num)*10000;
一切正常,直到我键入了123.050。而不是给我小数部分为“ 0.50”,而是给我5000,因为既然我的“小数”变量是int
,它就不算0。
还有其他转换方式吗?
答案 0 :(得分:0)
在%04d
中使用printf()
const int D4 = 10000;
double f = 123.050;
int i = round(f*D4);
int num = i / D4;
int decimales = i % D4;
printf("%d.%04d\n", num, decimales);
给予
123.0500
如果您担心int
溢出(因为我们将数字乘以10000
),请改用long
或long long
...
要将小数点保存在包含前导零的字符串中
char sdec[5];
sprintf(sdec, "%04d", decimales);
sdec
包含小数,包括前导零。
答案 1 :(得分:0)
由于嵌入式系统上的空间限制,您想要一种快速且肮脏的方法来生成一个带有浮点数的小数表示形式的字符串而无需链接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;
}