在 C 上将浮点数转换为 char 数组
Convert a float number to char array on C
我正在尝试将浮点数转换为字符数组。
sprintf()
对我不起作用,dtostrf
也不会。
因为我有十进制数的限制(它是 5)我试过这个:
int num = f;
int decimales = (f-num)*10000;
一切正常,直到我输入数字 123.050。它没有给我小数部分作为“0.50”,而是给了我 5000,因为现在我的 "decimal" 变量是 int
.
,它不计算 0
还有其他转换方式吗?
在printf()
中使用%04d
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
包含小数,包括前导零。
(另见 Is floating point math broken?)
由于 space 嵌入式系统的限制,您需要一种快速而肮脏的方法来生成具有浮点数的十进制表示的字符串而不链接 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 = '[=10=]';
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;
}
我正在尝试将浮点数转换为字符数组。
sprintf()
对我不起作用,dtostrf
也不会。
因为我有十进制数的限制(它是 5)我试过这个:
int num = f;
int decimales = (f-num)*10000;
一切正常,直到我输入数字 123.050。它没有给我小数部分作为“0.50”,而是给了我 5000,因为现在我的 "decimal" 变量是 int
.
还有其他转换方式吗?
在printf()
%04d
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
包含小数,包括前导零。
(另见 Is floating point math broken?)
由于 space 嵌入式系统的限制,您需要一种快速而肮脏的方法来生成具有浮点数的十进制表示的字符串而不链接 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 = '[=10=]';
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;
}