将浮点数转换为C

时间:2020-05-16 03:39:30

标签: c floating-point char type-conversion microcontroller

我正在尝试将浮点数转换为char数组。 sprintf()对我不起作用,dtostrf也不适合我。 由于我的十进制数有限制(为5),因此我尝试了以下方法:

    int num = f;
    int decimales = (f-num)*10000;

一切正常,直到我键入了123.050。而不是给我小数部分为“ 0.50”,而是给我5000,因为既然我的“小数”变量是int,它就不算0。

还有其他转换方式吗?

2 个答案:

答案 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),请改用longlong long ...

要将小数点保存在包含前导零的字符串中

char sdec[5];
sprintf(sdec, "%04d", decimales);

sdec包含小数,包括前导零。

(另请参见Is floating point math broken?

答案 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;
}