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位。
相关文章
|
12天前
|
编译器
fir原始崩溃栈解析
fir原始崩溃栈解析
7 0
|
18天前
|
机器学习/深度学习 算法 Unix
循环编码:时间序列中周期性特征的一种常用编码方式
循环编码是深度学习中处理周期性数据的一种技术,常用于时间序列预测。它将周期性特征(如小时、日、月)转换为网络可理解的形式,帮助模型识别周期性变化。传统的one-hot编码将时间特征转换为分类特征,而循环编码利用正弦和余弦转换,保持时间顺序信息。通过将时间戳转换为弧度并应用sin和cos,每个原始特征只映射到两个新特征,减少了特征数量。这种方法在神经网络中有效,但在树模型中可能需谨慎使用。
39 5
|
18天前
|
存储 JavaScript 前端开发
说说JavaScript数字精度丢失的问题,如何解决?
在 JavaScript 中,数字精度丢失是一种普遍的问题。这是因为 JavaScript 内部的数字均以 IEEE 754 标准的双精度浮点数格式存储,这种格式只能精确表示有限个小数,而对于一些无限循环小数或无理数,无法精确表示,就会出现精度丢失的情况。
39 0
|
7月前
|
JSON JavaScript 前端开发
js精度丢失坑
js精度丢失坑
62 1
|
10月前
|
算法 Linux Python
SGAT丨基于R语言tidyverse的vcf转txt文件算法,SNP位点判断与自动校正,染色体格式替换
SGAT丨基于R语言tidyverse的vcf转txt文件算法,SNP位点判断与自动校正,染色体格式替换
|
11月前
|
前端开发 Java
项目采坑日志——Java浮点类型数据进行加减运算出现精度丢失问题
项目采坑日志——Java浮点类型数据进行加减运算出现精度丢失问题
120 0
|
存储 Java
java 将小数拆分为两部分+浮点型精度丢失问题
java 将小数拆分为两部分+浮点型精度丢失问题
141 0
|
缓存 算法 JavaScript
雪花算法原理以及JS精度丢失问题
雪花算法原理以及JS精度丢失问题
453 0
|
算法
【计组】32位浮点数的表示范围以及如何解决精度缺失
【计组】32位浮点数的表示范围以及如何解决精度缺失
380 0
【计组】32位浮点数的表示范围以及如何解决精度缺失
|
JavaScript
js小数计算丢失精度问题
js小数计算丢失精度问题
169 0

热门文章

最新文章