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位。
相关文章
|
前端开发 应用服务中间件 nginx
react react-pdf实现在线pdf加载(翻页加载、下拉滚动加载)
react react-pdf实现在线pdf加载(翻页加载、下拉滚动加载)
|
2月前
|
存储 缓存 算法
软考通关密钥:计算机系统核心原理全解剖——软件设计师必懂的底层逻辑
专为软考中级软件设计师打造,深入解析CPU架构、存储体系、进制转换、原码补码、浮点数、寻址方式、校验码、RISC/CISC、流水线、Cache、中断、I/O控制、总线及加密技术等核心知识点,结合真题剖析高频考点,构建计算机系统底层知识体系,提升应试与实践能力。
281 1
软考通关密钥:计算机系统核心原理全解剖——软件设计师必懂的底层逻辑
|
3月前
|
存储 前端开发 JavaScript
Cookie、Session、Token、JWT 是什么?万字图解带你一次搞懂!看完这篇,你连老奶奶都能教
HTTP 协议是无状态的,就像一个“健忘”的银行柜员,每次请求都像第一次见面。为解决这一问题,常用的技术包括 Cookie、Session 和 Token。Cookie 是浏览器存储的小数据,Session 将数据存在服务器,Token(如 JWT)则是自包含的无状态令牌,适合分布式和移动端。三者各有优劣,适用于不同场景。
368 0
Cookie、Session、Token、JWT 是什么?万字图解带你一次搞懂!看完这篇,你连老奶奶都能教
|
6月前
|
编译器 调度 芯片
星闪开发入门级教程之安装编译器与小项目烧录
这是一篇关于星闪(新一代近距离无线连接技术)开发入门的教程,适合新手学习。文章从安装Hispark Studio编译器开始,详细讲解了环境配置、项目创建、代码修改及烧录过程。通过一个简单的红灯闪烁Demo,演示了GPIO控制和任务调度的基本用法。同时提供了功能代码解析,帮助理解LED高低电平控制原理。附有开发板相关资料链接,方便进一步学习。适合对嵌入式开发感兴趣的初学者参考实践。
536 20
|
图形学
【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)
【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)
1562 0
|
Linux
gpio_direction_output 和 gpio_set_value之间的关系
gpio_direction_output 和 gpio_set_value之间的关系
963 0
|
应用服务中间件 nginx
【报错集锦】mkdir(): Permission denied
【报错集锦】mkdir(): Permission denied
1475 0
【报错集锦】mkdir(): Permission denied
|
开发工具 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.
3256 0
|
存储 安全 Java
每日一道面试题之Collection 和 Collections 有什么区别?
每日一道面试题之Collection 和 Collections 有什么区别?
223 0