当前位置: 首页 > wzjs >正文

做设计网上揽活哪个网站最好软文代写自助发稿平台

做设计网上揽活哪个网站最好,软文代写自助发稿平台,徐州网络科技有限公司,网站框架代码在使用 CJSON 库处理浮点数时,开发者常会遇到一个棘手问题:浮点数的小数位精度丢失。例如,数值 3.1400 可能被简化为 3.14,甚至 5.0 被显示为 5。这种默认行为在需要严格保留小数位的场景(如金融、物联网传感数据&…

在使用 CJSON 库处理浮点数时,开发者常会遇到一个棘手问题:浮点数的小数位精度丢失。例如,数值 3.1400 可能被简化为 3.14,甚至 5.0 被显示为 5。这种默认行为在需要严格保留小数位的场景(如金融、物联网传感数据)中会引发严重问题。

本文将分析默认方法 cJSON_AddNumberToObject 的局限性,并介绍如何通过 cJSON_AddRawToObject 实现浮点数精度的精确控制。


一、问题分析:cJSON_AddNumberToObject 的局限性

  1. 默认行为
    cJSON_AddNumberToObject 是 CJSON 提供的快捷函数,用于向 JSON 对象中添加数值。其内部实现依赖 snprintf%g 格式符,自动省略无效的小数位和末尾零。例如:
cJSON_AddNumberToObject(root, "temperature", 23.50);
cJSON_AddNumberToObject(root, "pi", 3.140000);

序列化结果可能为:

{"temperature": 23.5,  // 末尾零被删除"pi": 3.14            // 多余小数位被截断
}
  1. 问题根源
    • 格式符 %g 的自动优化:%g 会删除无效零并缩短浮点表示(如 3.14003.14)。

• 数据精度丢失:若接收方依赖固定小数位数(如金额必须两位小数),默认行为会导致数据错误。


二、解决方案:cJSON_AddRawToObject 的精准控制

  1. 核心思路
    通过 cJSON_AddRawToObject 直接传递格式化后的数值字符串,绕过 CJSON 的默认序列化逻辑,从而完全控制小数位。

  2. 关键函数
    cJSON_AddRawToObject

向 JSON 对象中添加键值对,值的部分直接使用原始字符串(需符合 JSON 数值格式)。

void cJSON_AddRawToObject(cJSON *object, const char *name, const char *raw);

object: 目标 JSON 对象。

name: 键名。

raw: 值的字符串表示(如 "3.14")。

  1. 代码示例
#include <stdio.h>
#include "cJSON.h"int main() {cJSON* root = cJSON_CreateObject();double temperature = 23.5;double pi = 3.1415926;// 1. 默认方法(精度丢失)cJSON_AddNumberToObject(root, "temperature_bad", temperature);cJSON_AddNumberToObject(root, "pi_bad", pi);// 2. 精准控制方法char temp_buffer[32], pi_buffer[32];snprintf(temp_buffer, sizeof(temp_buffer), "%.2f", temperature); // 格式化为两位小数snprintf(pi_buffer, sizeof(pi_buffer), "%.4f", pi);               // 格式化为四位小数cJSON_AddRawToObject(root, "temperature_good", temp_buffer);cJSON_AddRawToObject(root, "pi_good", pi_buffer);// 输出结果char* json_str = cJSON_Print(root);printf("%s\n", json_str);cJSON_Delete(root);free(json_str);return 0;
}
  1. 输出结果
{"temperature_bad": 23.5,      // 默认方法:精度丢失"pi_bad": 3.1415926,          // 实际可能显示为 3.141593(精度问题)"temperature_good": 23.50,    // 强制两位小数"pi_good": 3.1416             // 强制四位小数(自动四舍五入)
}

三、关键注意事项

  1. 数据类型保证
    cJSON_AddRawToObject 生成的是 number 类型,而非字符串。

正确示例:"3.14" → 解析为数值。
错误示例:"3.14元" → 非数值格式,解析失败。

  1. 缓冲区溢出防护
    • 使用 snprintf 限制写入长度,避免内存越界:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%.2f", value); // 安全写法
  1. 四舍五入处理
    snprintf 的格式化会自动四舍五入:
double value = 3.1415926;
snprintf(buffer, sizeof(buffer), "%.2f", value); // 输出 "3.14"
snprintf(buffer, sizeof(buffer), "%.3f", value); // 输出 "3.142"
  1. 性能影响
    • 优点:直接控制精度,无需后处理。

• 缺点:频繁格式化字符串可能增加 CPU 开销。


四、扩展场景:科学计数法与大数据

  1. 科学计数法
    若数值过大或过小,可强制使用科学计数法:
double value = 0.00000314;
snprintf(buffer, sizeof(buffer), "%.2e", value); // 输出 "3.14e-06"
  1. 动态精度控制
    在业务逻辑中动态调整小数位数:
int precision = 2;
snprintf(buffer, sizeof(buffer), "%.*f", precision, value); // 保留两位小数

五、总结

  1. 方法对比
    | 方法 | 优点 | 缺点 |
    |-------------------------|-------------------------------|-----------------------|
    | cJSON_AddNumberToObject | 简单快捷 | 无法控制精度 |
    | cJSON_AddRawToObject | 精准控制小数位,保留数值类型 | 需手动格式化字符串 |

  2. 推荐场景
    • 严格精度需求(如金融、传感器数据):使用 cJSON_AddRawToObject

• 临时调试或非关键数据:使用默认 cJSON_AddNumberToObject

  1. 终极建议
    在关键业务逻辑中,永远不要依赖默认浮点序列化。通过 cJSON_AddRawToObject 显式控制精度,可避免因数据格式问题引发的系统性风险。
http://www.dtcms.com/wzjs/356117.html

相关文章:

  • 自己做网站推广试玩外贸网站推广软件
  • 慈善总会网站建设方案百度推广网站平台
  • 户外运动网站程序win10优化大师好用吗
  • 建设银行流水网站西安seo推广
  • 微信公众平台注册小程序要钱吗seo在线排名优化
  • 嵌入式软件开发岗位职责兰州seo优化入门
  • 武冈市住房和城乡建设局网站深圳百度推广公司
  • seo 网站树搜索引擎优化seo怎么做
  • 营销网站开发安徽百度推广怎么做
  • 菜鸟怎样做自己的网站网络营销方法和手段
  • 督查营商环境建设网站2022黄页全国各行业
  • 深圳外贸网站怎么建长沙seo公司排名
  • html5怎么做二手网站关键词搜索趋势
  • 做企业网站要哪些人员网络营销师
  • 衣服销售网站建设规划书范文企业网站制作教程
  • 成都学生网站制作2024年3月新冠肺炎
  • 旅游网站课程设计北京seo做排名
  • 只有虚拟主机可以做网站吗前端性能优化
  • 彩票网站APP建设珠海百度关键词优化
  • 郑州web网站建设公司国内免费顶级域名注册
  • 做批发的网站有哪些2022新闻热点10条
  • 做网站 长网页设计期末作业模板
  • 河南企业网站建设价格十大教育培训机构排名
  • 服装手机商城网站建设今日军事新闻最新消息中国
  • 网站设计细节怎么在百度上发布广告
  • 给境外赌博网站做代理郑州有没有厉害的seo顾问
  • 无锡设计网站找哪家网站推广四个阶段
  • 医学院英文网站建设方案百度广告投放价格
  • 网站建设银川搜索引擎优化英文简称为
  • 惠州市建设公司网站国家市场监督管理总局