cJSON精度丢失问题

简介: 问题复现步骤: 1) 输入字符串: {     "V":0.12345678 } 2) 字符串转成cJSON对象 3) 调用cJSON_Print将cJSON对象再转成字符串 4) 再将字符串转成cJSON对象 5) 保留8位精度方式调用printf打印值,输出变成:0.
问题复现步骤:
1) 输入字符串:
{
    "V":0.12345678
}


2) 字符串转成cJSON对象


3) 调用cJSON_Print将cJSON对象再转成字符串
4) 再将字符串转成cJSON对象
5) 保留8位精度方式调用printf打印值,输出变成:0.123456


问题的原因出在cJSON的print_number函数:
static char *print_number(cJSON *item)
{
    char *str;
    double d = item->valuedouble;
    if (fabs(((double) item->valueint) - d)                     && d >= INT_MIN)
    {
        str = (char*) cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */
        if (str)
            sprintf(str, "%d", item->valueint);
    }
    else
    {
        str = (char*) cJSON_malloc(64); /* This is a nice tradeoff. */
        if (str)
        {
            if (fabs(floor(d) - d)                 sprintf(str, "%.0f", d);
            else if (fabs(d) 1.0e9)
                sprintf(str, "%e", d);
            else
                sprintf(str, "%f", d);
        }
    }
    return str;
}


最后一个sprintf调用没有指定保留的精度,默认为6位,这就是问题的原因。
注:float的精度为6~7位有效数字,double的精度为15~16位。
相关文章
|
8月前
|
人工智能 自然语言处理 Linux
NobodyWho:每个NPC都有独立灵魂!Godot插件实现本地LLM对话,离线生成多线剧情
NobodyWho 是一款为 Godot 游戏引擎设计的插件,支持在本地运行 LLM,实现互动小说创作,无需联网,确保隐私和高性能。
450 14
NobodyWho:每个NPC都有独立灵魂!Godot插件实现本地LLM对话,离线生成多线剧情
|
算法 安全 C++
[算法] 字符串 | 字符串哈希理论基础
[算法] 字符串 | 字符串哈希理论基础
|
JavaScript
vue项目中package.json的个人见解
总的来说,package.json文件是Vue项目的心脏,它记录了项目运行所需的所有信息,是项目能够顺利运行和维护的关键。
180 0
|
Linux
gpio_direction_output 和 gpio_set_value之间的关系
gpio_direction_output 和 gpio_set_value之间的关系
902 0
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
1843 0
|
开发工具 git
git设置默认编辑为vim
f you want to set the editor only for Git, do either (you don’t need both): Set core.editor in your Git config: git config --global core.
2990 0
四面阿里斩获offer定级P7,2024最新最全阿里巴巴68道高级面试题
一年之计在于春 疫情过去,五一假期之后,气温逐渐回暖,几个朋友五一聚在一起聊天的时候统一发现,新的一波招聘旺季,可能马上要开始已经要到来,2020的新的开始不太好,这次的招聘依旧竞争压力山大,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度?
|
算法
【算法总结】字符串哈希
【算法总结】字符串哈希
249 0
|
存储 安全 Java
每日一道面试题之Collection 和 Collections 有什么区别?
每日一道面试题之Collection 和 Collections 有什么区别?
203 0