【问题标题】:How to convert fractional part of double to string or fractional part of double to integer using c without changing exact value如何使用c将double的小数部分转换为字符串或将double的小数部分转换为整数而不更改确切值
【发布时间】:2021-08-01 12:26:12
【问题描述】:

有没有办法在不改变值的情况下将双精度转换为字符串?或者有没有办法将数字的小数部分截断为一定的十进制精度并长存储?转换似乎向上或向下舍入,这在我的情况下不起作用。

double t = 8.299877766666;

具有完全相同的值或截断到某些十进制精度的字符串,例如包含“299877766666”或“0.29987”的字符串?

【问题讨论】:

  • double tt = t; /* do your stuff that changes t */; t = tt; /* voila */
  • Scarlet,您认为哪个double 需要转换? t中的值还是源代码8.299877766666? (提示:它们不一样。)

标签: c string floating-point type-conversion double


【解决方案1】:

不确定你尝试了什么,但天真的东西对我有用:

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 编码而不是十进制。这可能会导致您的一些“舍入问题”。例如,可以用双精度表示的最接近的值比您问题中的值略大,如通过printf 打印出额外数字时所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2015-07-29
    相关资源
    最近更新 更多