加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cJSON精度丢失问题

发布时间:2020-12-16 19:46:54 所属栏目:百科 来源:网络整理
导读:问题复现步骤: 1) 输入字符串: { "V":0.12345678 } 2) 字符串转成cJSON对象 3) 调用cJSON_Print将cJSON对象再转成字符串 4) 再将字符串转成cJSON对象 5) 保留8位精度方式调用printf打印值,输出变成:0.123456 问题的原因出在cJSON的print_number函数: st
问题复现步骤: 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位。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读