C - 获取double中的位数

时间:2014-11-18 11:09:35

标签: c string double

这个问题已被提出,但我找不到令人满意的答案。

我需要在不知道它是什么的情况下获得双精度数字,并且零可以在任何地方。

例如,如果它是12.00032110,我需要得到数字11(带点和最后计数零)

我尝试将它们转换为字符串来获取它们的长度,但为此我需要事先知道它们的长度,因为我需要指定一个精度。如果我选择"%。5f"然后所有这些都将在点后有5位数,因此我无法获得原始长度。如果我选择"%f"所有较长的都被截断了,我无法得到原来的长度。

这是什么解决方案?我一整天都在寻找答案,但没有成功。

1 个答案:

答案 0 :(得分:2)

您可以尝试查找在转换为十进制浮点数时产生数字的最短字符串。下面的函数通过以更高的精度重复写入和扫描来执行此操作(假设您提供了足够长的char缓冲区):

char *strfloat(char buf[], int n, double d)
{
    int p;

    for (p = 0; p < 20; p++) {
        double x;

        if (snprintf(buf, n, "%.*g", p, d) >= n) break;;
        sscanf(buf, "%lf", &x);
        if (x == d) break;
    }

    return buf;
}

您的长度是缓冲区保存的字符串的strlen。但是,你永远不会得到带有尾随零的小数。