如何在不更改精确值的情况下使用c将double的小数部分转换为字符串或将double的小数部分转换为整数

How to convert fractional part of double to string or fractional part of double to integer using c without changing exact value

有没有办法在不改变值的情况下将double转换成string?或者有没有办法将数字的小数部分截断到一定的小数精度并存储在 long 中?转换似乎向上或向下舍入,这在我的情况下不起作用。

double t = 8.299877766666;

要么是包含完全相同值的字符串,要么是被截断为特定小数精度的字符串,例如包含“299877766666”或“0.29987”的字符串?

不确定您尝试了什么,但天真的方法对我有用:

uint64_t frac_dig(double x, int digits)
{
    // 20 non-zero digits will overflow a 64bit integer
    assert(0 < digits && digits < 20);

    // remove non-fractional digits, and strip off sign
    x = fabs(fmod(x, 1));

    uint64_t result = 0;

    while (digits-- > 0) {
        x *= 10;
        result *= 10;
        int i = x;
        result += i;
        x -= i;
    }

    return result;
}

测试通过

    double t = -8.299877766666;
    printf("%.24f  = %lu\n", t, frac_dig(t, 19));

打印出来

-8.299877766666000411532877  = 2998777666660004115

请注意,浮点值是 base-2 编码的,而不是十进制的。这可能会导致您的一些“舍入问题”。例如,可以用 double 表示的最接近的值略大于您问题中的值,如通过 printf.

打印出额外数字时所示