博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cJSON精度丢失问题
阅读量:7047 次
发布时间:2019-06-28

本文共 731 字,大约阅读时间需要 2 分钟。

问题复现步骤:
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位。

转载地址:http://rxcol.baihongyu.com/

你可能感兴趣的文章
Azure编配器简化有状态无服务器工作流的创建
查看>>
AWS App Mesh:用于Envoy的服务网格控制平面
查看>>
专访ThoughtWorks王磊:从单块架构到微服务架构
查看>>
JetBrains大力推广Kotlin为哪般?
查看>>
IBM首家发布了公有云中的裸机Kubernetes
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
Zabbix Agent端配置文件说明
查看>>
2.10环境变量PATH;2.11cp命令;2.12mv命令;2.13文档查看cat_more...
查看>>
mysql使用索引优化查询效率
查看>>
Salt Syndic配置
查看>>
Linux下Git和GitHub使用方法总结 (码云)
查看>>
windows phone 浏览器
查看>>
SCCM TP4创建边界和边界组
查看>>
Oracle 备份与恢复学习笔记(13)
查看>>
结合Ansible在AWS云计算平台上实现运维自动化
查看>>
NA-NP-IE系列实验57:多区域OSPF 末节区域和完全末节区域
查看>>
【汉字乱码】IE下GET形式传递汉字。
查看>>
解决使用BottomSheetDialog时状态栏变黑的问题
查看>>
如何使用Orchard搭建敏捷个人的网站(2)
查看>>
Win7系统下共享文件夹后共享文件夹上的小锁图标取消方法
查看>>