zoukankan      html  css  js  c++  java
  • cJSON精度丢失问题

    问题复现步骤:
    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) <= DBL_EPSILON && d <= INT_MAX
                        && 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) <= DBL_EPSILON)
                    sprintf(str, "%.0f", d);
                else if (fabs(d) < 1.0e-6 || fabs(d) > 1.0e9)
                    sprintf(str, "%e", d);
                else
                    sprintf(str, "%f", d);
            }
        }
        return str;
    }


    最后一个sprintf调用没有指定保留的精度,默认为6位,这就是问题的原因。
    注:float的精度为6~7位有效数字,double的精度为15~16位。
  • 相关阅读:
    【翻译】让你的网站飞起来
    理解ASP.NET MVC中的模型绑定
    【转载】创建定制ASP.NET MVC视图引擎
    修改STM32主频
    Cortex系列ARM核心及体系结构介绍
    递归
    NFD模拟兴趣包的转发
    NX 笔记
    MicroPython 8266 配置
    Python JSON操作
  • 原文地址:https://www.cnblogs.com/aquester/p/9891488.html
Copyright © 2011-2022 走看看