CJson-修改浮点数的位数

CJSON:浮点数精度控制与字符串转换
本文探讨了在使用CJSON库时,如何处理浮点数转换为字符串时的精度问题。默认的%1.15g格式可能导致不期望的精度损失。解决方案包括直接修改库函数或使用cJSON_CreateRaw()结合自定义的浮点数格式化。通过自定义格式,可以确保浮点数以指定精度呈现。

现状

调用cJSON_Print()将组成的json转为字符串格式时,对于浮点数的位数是不固定的
length = sprintf((char*)number_buffer, "%1.15g", d);
源代码里用的是%1.15g,代表输出字符最少一位,最大15位,自动选择%e%f中合适的表示法。

  1. %g用于打印浮点型数据时,会去掉多余的零,至多保留六位有效数字(不同于%e的默认保留小数点后6位)
  2. 当%g用于打印超过6位的浮点型数据时,因为精度问题,%f不得不输出一个不精确的超过六位的数字,%e也是同样,而%g此时会选择%e格式进行输出,并且按第一条要求,去掉多余的零,并且四舍五入到6位数字。这是《C Primer Plus》中所说的超过精度的时候的情况。

解决方案

  1. 直接修改print_number()函数
    这样的更改会造成全局影响。

  2. 使用cJSON_CreateRaw()

 char num_string[26]={0};
 float number = 1.23456;

 /* 自己将浮点数转换成字符串 */
 snprintf(num_string,sizeof(num_string),"%1.3f",number);
 /* 将字符串传入,这样打印时就会打印成你自己处理的格式的字符串 */
 cJSON_CreateRaw(num_string);
<think>我们注意到用户提到在CentOS8中使用dnf安装cjson-devel失败。根据之前的回答,我们提供了两种安装方法:通过包管理器安装和源码编译安装。用户尝试了包管理器安装但失败,因此我们需要提供替代方案。 问题分析: 在CentOS 8中,默认仓库可能不包含cjson-devel包,或者包名可能有变化。我们可以尝试以下解决方案: 解决方案: 1. 启用EPEL仓库并再次尝试安装(可能用户已经启用,但可以确认) 2. 使用源码编译安装(推荐,因为EPEL仓库可能没有该包) 3. 使用其他第三方仓库(如PowerTools)或手动下载rpm包 步骤: 方法一:确认EPEL仓库已启用并搜索包 ```bash # 启用EPEL仓库(如果未启用) sudo dnf install epel-release # 更新仓库缓存 sudo dnf makecache # 搜索cjson相关包 sudo dnf search cjson ``` 如果搜索到包名不是`cjson-devel`,则安装对应的包。 方法二:源码编译安装(如果方法一失败) 步骤在之前的回答中已经给出,这里再详细说明: ```bash # 安装编译工具 sudo dnf groupinstall "Development Tools" sudo dnf install git cmake # 克隆cJSON源码 git clone https://github.com/DaveGamble/cJSON.git cd cJSON mkdir build cd build cmake .. -DENABLE_CJSON_UTILS=On -DCMAKE_INSTALL_PREFIX=/usr/local make sudo make install ``` 方法三:如果用户需要rpm包,可以尝试从Fedora EPEL仓库下载,但需要注意版本兼容性。 另外,根据用户提供的引用[1],有提到安装python-cjson,但这是一个Python库,不是C库。用户可能混淆了,需要明确用户需要的是C语言的cJSON库还是Python的cjson模块。 但根据用户的问题上下文,我们讨论的是C语言的cJSON库,因此应忽略python-cjson。 因此,我们重点推荐方法二(源码编译安装)。 安装后的配置: 1. 头文件安装在`/usr/local/include/cjson/cJSON.h`,所以在代码中包含时使用`#include <cjson/cJSON.h>` 2. 库文件安装在`/usr/local/lib/libcjson.so`,所以在链接时需要添加`-lcjson`,并可能需要将库路径加入链接器搜索路径(如果不在默认路径): - 编译时添加:`-L/usr/local/lib` - 或者将库路径加入系统配置:`sudo ldconfig` 示例编译命令: ```bash gcc example.c -o example -I/usr/local/include -L/usr/local/lib -lcjson ``` 如果出现运行时找不到库,可以设置环境变量: ```bash export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` 或者永久添加: ```bash echo '/usr/local/lib' | sudo tee /etc/ld.so.conf.d/cjson.conf sudo ldconfig ``` 现在,我们针对用户的问题给出具体步骤。</think>在 CentOS 8 中使用 `dnf install cjson-devel` 失败是因为该软件包在标准仓库中不可用。以下是完整的解决方案: ### 一、问题原因分析 1. **官方仓库缺失**:CentOS 8 标准仓库和 EPEL 仓库均不包含 `cjson-devel` 包 2. **包名差异**:cJSON 开发包在 CentOS 中的标准名称是 `libcjson-devel` 3. **兼容性问题**:CentOS 8 已停止维护,部分软件包可能不可用 ### 二、解决方案(推荐方法) #### 方法 1:源码编译安装(最佳方案) ```bash # 安装编译依赖 sudo dnf install -y git cmake gcc make # 克隆源码(使用官方仓库) git clone https://github.com/DaveGamble/cJSON.git cd cJSON # 编译安装 mkdir build cd build cmake .. -DENABLE_CJSON_UTILS=On -DCMAKE_INSTALL_PREFIX=/usr make -j$(nproc) sudo make install # 验证安装 ls /usr/include/cjson/cJSON.h # 头文件位置 ls /usr/lib64/libcjson.so # 库文件位置 ``` #### 方法 2:使用替代包名(如可用) ```bash # 尝试搜索可用包 sudo dnf search cjson # 可能出现的替代包名 sudo dnf install -y libcjson-devel # 某些第三方仓库可能提供 ``` ### 三、配置开发环境 #### 1. 包含头文件 ```c #include <cjson/cJSON.h> ``` #### 2. 编译命令 ```bash gcc your_program.c -o output -I/usr/include -lcjson ``` #### 3. CMake 配置示例 ```cmake cmake_minimum_required(VERSION 3.10) project(cJSON_Example) find_package(PkgConfig REQUIRED) pkg_check_modules(CJSON REQUIRED libcjson) add_executable(main main.c) target_include_directories(main PRIVATE ${CJSON_INCLUDE_DIRS}) target_link_libraries(main ${CJSON_LIBRARIES}) ``` ### 四、安装验证程序 ```c #include <stdio.h> #include <cjson/cJSON.h> int main() { const char *version = cJSON_Version(); printf("cJSON version: %s\n", version); cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "status", "success"); char *json = cJSON_Print(root); printf("JSON output: %s\n", json); cJSON_Delete(root); free(json); return 0; } ``` 编译运行: ```bash gcc test.c -o test -lcjson ./test # 输出应显示版本信息和JSON ``` ### 五、常见问题解决 1. **头文件找不到**: ```bash # 指定头文件路径 gcc ... -I/usr/include/cjson ``` 2. **链接失败**: ```bash # 添加库路径 gcc ... -L/usr/lib64 -lcjson # 永久配置 echo '/usr/lib64' | sudo tee /etc/ld.so.conf.d/cjson.conf sudo ldconfig ``` 3. **兼容性问题**: ```bash # 如果使用较旧版本CentOS 8 sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm ``` > **重要提示**:CentOS 8 已于2021年停止维护,建议考虑升级到 CentOS Stream 或 Rocky Linux/AlmaLinux 等替代发行版以获得更好的软件包支持[^1]。 ### 六、替代方案 如果仍遇到问题,可考虑: 1. 使用其他 JSON 库: ```bash sudo dnf install -y jansson-devel # 安装Jansson库 ``` 2. 通过 Conan 包管理器安装: ```bash pip install conan conan install cjson/1.7.15@ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangYi0_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值