将浮点数转换为字符串

2023-11-25

如何在不使用库函数的情况下将 C/C++ 中的浮点整数转换为字符串sprintf?

我正在寻找一个功能,例如char *ftoa(float num)转换num到一个字符串并返回它。

ftoa(3.1415)应该返回"3.1415".


根据 Sophy Pal 的回答,这是一个稍微更完整的解决方案,考虑了数字零、NaN、无穷大、负数和科学记数法。尽管 sprintf 仍然提供更准确的字符串表示形式。

/* 
   Double to ASCII Conversion without sprintf.
   Roughly equivalent to: sprintf(s, "%.14g", n);
*/

#include <math.h>
#include <string.h>
// For printf
#include <stdio.h>

static double PRECISION = 0.00000000000001;
static int MAX_NUMBER_STRING_SIZE = 32;

/**
 * Double to ASCII
 */
char * dtoa(char *s, double n) {
    // handle special cases
    if (isnan(n)) {
        strcpy(s, "nan");
    } else if (isinf(n)) {
        strcpy(s, "inf");
    } else if (n == 0.0) {
        strcpy(s, "0");
    } else {
        int digit, m, m1;
        char *c = s;
        int neg = (n < 0);
        if (neg)
            n = -n;
        // calculate magnitude
        m = log10(n);
        int useExp = (m >= 14 || (neg && m >= 9) || m <= -9);
        if (neg)
            *(c++) = '-';
        // set up for scientific notation
        if (useExp) {
            if (m < 0)
               m -= 1.0;
            n = n / pow(10.0, m);
            m1 = m;
            m = 0;
        }
        if (m < 1.0) {
            m = 0;
        }
        // convert the number
        while (n > PRECISION || m >= 0) {
            double weight = pow(10.0, m);
            if (weight > 0 && !isinf(weight)) {
                digit = floor(n / weight);
                n -= (digit * weight);
                *(c++) = '0' + digit;
            }
            if (m == 0 && n > 0)
                *(c++) = '.';
            m--;
        }
        if (useExp) {
            // convert the exponent
            int i, j;
            *(c++) = 'e';
            if (m1 > 0) {
                *(c++) = '+';
            } else {
                *(c++) = '-';
                m1 = -m1;
            }
            m = 0;
            while (m1 > 0) {
                *(c++) = '0' + m1 % 10;
                m1 /= 10;
                m++;
            }
            c -= m;
            for (i = 0, j = m-1; i<j; i++, j--) {
                // swap without temporary
                c[i] ^= c[j];
                c[j] ^= c[i];
                c[i] ^= c[j];
            }
            c += m;
        }
        *(c) = '\0';
    }
    return s;
}

int main(int argc, char** argv) {

    int i;
    char s[MAX_NUMBER_STRING_SIZE];
    double d[] = {
        0.0,
        42.0,
        1234567.89012345,
        0.000000000000018,
        555555.55555555555555555,
        -888888888888888.8888888,
        111111111111111111111111.2222222222
    };
    for (i = 0; i < 7; i++) {
        printf("%d: printf: %.14g, dtoa: %s\n", i+1, d[i], dtoa(s, d[i]));
    }
}

Outputs:

  1. 打印:0,dtoa:0
  2. 打印:42,dtoa:42
  3. 打印:1234567.8901234,dtoa:1234567.89012344996444
  4. 打印:1.8e-14,dtoa:1.79999999999999e-14
  5. 打印:555555.55555556,dtoa:555555.55555555550381
  6. printf: -8.8888888888889e+14, dtoa: -8.88888888888888e+14
  7. printf: 1.1111111111111e+23, dtoa: 1.11111111111111e+23
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将浮点数转换为字符串 的相关文章

随机推荐

  • 如何使用 jQuery 模板设置日期/时间格式?

    我刚刚开始使用jQuery 模板作为我的 javascript 模板引擎 我的问题是 如何将日期 从 ASP NET Json ActionResult 返回 格式化为以下形式 Date 1288709830000 我尝试执行以下操作 fo
  • 优化Java中字符串集合的内存使用

    我有大量的名称 值对 大约 100k 我需要将它们存储在某种缓存 例如哈希映射 中 其中值是平均大小约为 30k 字节的字符串 现在我知道一个事实 即大量值具有完全相同的字符串数据 为了避免多次分配相同的字符串数据 我想以某种方式重用以前分
  • Android - ImageView 内的画布绘制线

    我有一个 ImageView 我想在其中画一条线 我已经做了以下操作 mImagenCampo ImageView findViewById R id imagen campo crearPunto mArea9M mPaloIzq v g
  • 如何在Android SQLite中使用TRIGGER

    我的数据库中有两个表 表一有姓名和房间号栏 表二有房间号和时间栏 现在 当删除或添加第一列中的房间号时 我的第二个表也应该更新 我认为这可以通过 TRIGGER 命令实现 但我不太确定如何使用它 一般来说我的创建数据库语句是这样的 priv
  • 获取年份中的季度开始日期和结束日期

    我正在使用 SQL Server 2008 我想获取一年中所有季度的开始日期和结束日期 例如 如果我在查询中传递 2013 那么输出应该像 StartDate EndDate QuarterNo 2013 04 01 00 00 00 00
  • 未使用 MetadataType 加载元数据

    我有一些问题 疑问元数据类型 我有 DLL 帮助程序项目 用于使用 LinqToSQL 从 MS SQL Server 访问数据 我还需要为生成的类 ClientInfoView 添加元数据 我是按照以下方式完成的 using System
  • 如何识别程序集是使用 .NET 4.5(而不是 .NET 4.0)编译的?

    我有一些构建代理通过 TeamCity 设置为我们构建 NET 代码 我开始怀疑 尽管有项目设置 它们是否仍在输出 NET 4 5 构建的程序集 我的怀疑来自于这样一个事实 我不知道 Windows 2012 Server 是否附带了开箱即
  • 在 ViewPager 内部设计 Horizo​​ntalScrollView 或使用片段:

    我需要设计以下屏幕 需要您的建议 解释 标题是静态 固定的 我不需要对它做任何事情 Yellow 这是有趣的部分 我需要设计一个ViewPager类似于能够向左 向右滚动最多 4 个屏幕的屏幕 Red 在每个屏幕中 我需要添加一个表格 网格
  • 更改选项卡时如何隐藏软键盘?

    编辑 看来我没有说清楚 我需要的是一种每当我替换所在片段时隐藏软键盘的方法 我该如何去做呢 让我保持简单 我在 Tab Fragment 1 2 中有一个 EditText 框 按下时它显然会打开软键盘 当选项卡更改时如何隐藏它 我在 on
  • Android,对话框中的SeekBar

    我想在我的应用程序中使用带有搜索栏的对话框 但我真的不知道该怎么做 因为我缺乏 Android 经验 因此 当您按下按钮时 应该出现一个带有搜索栏的对话框 用户可以输入一个值 然后按 确定 按钮 我现在的代码是developer andro
  • Class.getResource() 返回 null

    我试图在 JPanel 上显示图片 但我不断收到错误 java lang IllegalArgumentException 输入 null 我不明白发生了什么事 这是我正在使用的代码 public void actionPerformed
  • 如何将桌面图标设置为C# Windows窗体[重复]

    这个问题在这里已经有答案了 我已经调试了 C WinForm exe 将其复制到桌面并想将其分发给其他人 如何为此 exe 设置 ico 以便桌面图标自动出现在计算机上 该计算机也会下载它 而无需进行任何调整 在 Visual Studio
  • 根据列对二维 int 数组进行排序的过程

    我之前拥有的数组以及排序后我们想要的数组 Before Box Weight Priority 1 50 5 2 30 8 3 90 6 4 20 7 5 80 9 After Box Weight Priority 3 90 6 5 80
  • 我如何知道故障转储的 CLR 版本?

    我有一个 NET 应用程序崩溃的小型转储 有没有办法使用 Windbg 或其他工具了解故障机器 生成故障转储 的 CLR 版本 例如 mscorwks dll 的版本 在 WinDbg 中 最简单的方法是使用 eeversion命令 但如果
  • Callable 基类无效?

    有人可以解释为什么继承自非参数化和参数化Callable from typing import Callable from typing import NoReturn from typing import TypeVar T TypeVa
  • 将选项传递给 chrome 驱动程序 selenium

    我正在尝试禁用 chrome 控制台的输出 如果我通过 start maximized 选项 它就可以正常工作 我可能命令错误 DesiredCapabilities capabilities DesiredCapabilities chr
  • 无法更新到 com.google.gms:google-services:4.2.0

    启动时谷歌服务版本 是classpath com google gms google services 4 1 0 但是当我将其更改为4 2 0错误发生在Sync Project with Gradle files 我的顶级等级 Top l
  • PHP:通过 Parent::method() 与 $this->method() 从子类调用方法的差异

    假设我有一个家长班 class parentClass public function myMethod echo parent myMethod was called 和下面的子班 class childClass extends par
  • pyinstaller 失败并出现错误

    我正在使用 pyinstaller 编译当前的程序 它似乎无法处理所有需要的文件 它本身运行良好 并且无需绘图也可以编译和运行 似乎无法找到文件 default schema json 我什至无法在驱动器上的任何位置找到该文件 回溯 最近一
  • 将浮点数转换为字符串

    如何在不使用库函数的情况下将 C C 中的浮点整数转换为字符串sprintf 我正在寻找一个功能 例如char ftoa float num 转换num到一个字符串并返回它 ftoa 3 1415 应该返回 3 1415 根据 Sophy