我正在尝试将浮点数转换为 char 数组。
sprintf()不会为我工作,也不会dtostrf。由于我对十进制数有限制(它是 5),我尝试了这个:
int num = f;
int decimales = (f-num)*10000;
在我输入数字 123.050 之前,一切正常。它没有给我小数部分“0.50”,而是给了我一个 5000,因为现在我的“小数”变量是int.
有没有其他方法可以转换它?
我正在尝试将浮点数转换为 char 数组。
sprintf()不会为我工作,也不会dtostrf。由于我对十进制数有限制(它是 5),我尝试了这个:
int num = f;
int decimales = (f-num)*10000;
在我输入数字 123.050 之前,一切正常。它没有给我小数部分“0.50”,而是给了我一个 5000,因为现在我的“小数”变量是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;
}
用于%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包含小数,包括前导零。
(另请参阅浮点数学是否损坏?)