求一个高效的double转char*的算法,C或C++

发布于 2022-09-01 22:18:56 字数 261 浏览 13 评论 0

形如
double 33.333 => char* "33.333"
double 1e+5 => char* "100000"

要求:

  1. 考虑浮点数范围(不能直接强转为int或long)

  2. 考虑浮点数的精度(处理边界问题)

  3. 尽量不使用其它库函数

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

十雾 2022-09-08 22:18:56

sprintf难道不够高效?
不用库函数把sprintf关于%f的拿出来就好了。

随遇而安 2022-09-08 22:18:56

如果你想连sprintf对%的处理都省掉的话,建议使用_gcvt_s函数。

使用方法如下:

    char buffer[320];
    _gcvt_s(buffer, 320, number, 30);
    vint len = (vint)strlen(buffer);
    if (buffer[len - 1] == '.')
    {
        buffer[len - 1] = '\0';
    }

如果你使用的编译期没有_gcvt_s的话,可以自己封装一个:

void _gcvt_s(char* buffer, size_t size, double value, vint numberOfDigits)
{
    sprintf(buffer, "%f", value);
    char* point = strchr(buffer, '.');
    if(!point) return;
    char* zero = buffer + strlen(buffer);
    while(zero[-1] == '0')
    {
        *--zero = '\0';
    }
    if(zero[-1] == '.') *--zero = '\0';
}

这样程序在别的编译期下既,而且在VC++下面又可以发挥优异的性能。

错爱 2022-09-08 22:18:56

为什么没有人提grisu算法。它是一个最快的,“完全正确”的算法
放库跑:https://github.com/night-shift/fpconv

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文