尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JSON for Modern C++ 数值类型详解:number_float_t 的内部表示、序列化行为与自定义浮点类型
JSON for Modern C 数值类型详解number_float_t 的内部表示、序列化行为与自定义浮点类型【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json导读number_float_t是 JSON for Modern Cnlohmann/json库中用于存储 JSON 浮点数的核心类型别名它直接决定了库如何处理小数、指数、NaN 以及超出 double 范围的数值。本文以官方 API 文档 number_float_t.md 为主体结合库源码与可运行示例讲解它的定义来源、默认行为、精度边界、存储方式并演示如何通过模板参数将其替换为long double等自定义浮点类型。读完本文你将能准确预判任意浮点 JSON 值在库中的解析与序列化结果并在需要更高/更低精度时正确定制该类型。number_float_t 是什么在 json.hpp 中number_float_t被定义为一个指向模板参数的类型别名using number_float_t NumberFloatType;它被官方文档描述为“The type used to store JSON numbers (floating-point)”即用于存储 JSON 数值中浮点数部分的具体 C 类型。之所以要区分三种数值类型是因为 JSON 规范 RFC 8259无符号整数用 number_unsigned_t浮点数则用本文的number_float_t。从 value_t.hpp 的注释也可以看到这种区分正是为了在判别 JSON 值种类is_number_float()等时与底层类型一一对应。模板声明中的默认值doublenumber_float_t的底层类型由basic_json的模板参数NumberFloatType决定。在 json_fwd.hpp 的前向声明中可以看到完整默认参数列表template templatetypename U, typename V, typename... Args class ObjectType std::map, templatetypename U, typename... Args class ArrayType std::vector, class StringType std::string, class BooleanType bool, class NumberIntegerType std::int64_t, class NumberUnsignedType std::uint64_t, class NumberFloatType double, templatetypename U class AllocatorType std::allocator, ... class basic_json;即NumberFloatType的默认值是double所以nlohmann::json即basic_json中的number_float_t默认就是double。官方的可运行示例 number_float_t.cpp 用std::is_same在编译期验证了这一事实#include iostream #include iomanip #include nlohmann/json.hpp using json nlohmann::json; int main() { std::cout std::boolalpha std::is_samedouble, json::number_float_t::value std::endl; }编译运行后输出见 number_float_t.outputtrue如果你希望自行复现只需保证nlohmann/json.hpp可被找到本仓库将其合并且可直接使用的单头文件位于 single_include/nlohmann/json.hpp例如可以用g -stdc11 -I single_include number_float_t.cpp编译。默认行为前导零与 NaN 的处理原文档指出库对浮点数有两个值得注意的非严格 JSON默认行为前导零序列化忽略反序列化报错在 C 一侧构造浮点值时01.2这类带前导零的字面量在 C 解析层面就被忽略前导零值内部按十进制小数存储序列化dump()结果为1.2而在反序列化解析一侧输入中出现01.2之类的前导零会直接产生解析错误。这源于 C 本身将01.2视作浮点字面量1.2C 仅在整数八进制字面量场景对前导零敏感而 JSON 解析器则严格遵循 RFC 8259 的前导零不允许规则。NaN 序列化为 null浮点值如果是 Not-a-NumberNaN序列化时会被输出为null而不是非法 JSON 文本。这一行为在 serializer.hpp 的dump_float入口处有直接实现void dump_float(number_float_t x) { // NaN / inf if (!std::isfinite(x)) { o-write_characters(null, 4); return; } ... }可以看到只要数值非有限含 NaN 与无穷大序列化器就会直接写入null四个字节从而保证输出的文本永远是合法 JSON。精度与范围限制RFC 8259 允许各实现自行限定所接受数字的精度与范围并推荐采用普遍可用的 IEEE 754-2008 binary64双精度作为互操作基线。本库正是沿用了这一思路默认的double即 IEEE 754 双精度因此能表达的数值与常见 C/C/Java 等语言的double保持一致。原文档特别强调了一个边界行为小于-1.79769313486232e308、大于1.79769313486232e308的值内部会被存储为 NaN并在序列化时输出为null。这里的±1.79769313486232e308正是double的近似最大值约DBL_MAX。也就是说超出双精度可表示范围即发生上溢的浮点字面量在进入basic_json时即被置为 NaN最终序列化结果是null而非一个溢出后的非法数值。存储方式浮点数内联于 JSON 值与字符串、数组、对象等需要堆分配的复合类型不同浮点数作为标量被直接存储在basic_json对象内部。从 json.hpp 的clear()实现可以清楚地看到它的存取形态case value_t::number_float: { m_data.m_value.number_float 0.0; break; }m_value是按value_t类型区分的一个内部联合体/存储成员number_float字段的类型正是number_float_t。这种值内联 无堆分配的设计让浮点 JSON 值的构造、拷贝与析构开销极小也是 operator_ltlt/gtgt 等 I/O 操作高效的原因之一。序列化内部原理不同浮点类型的专属输出路径浮点数最终如何被写成文本取决于number_float_t的实际类型。serializer.hpp 在编译期用std::numeric_limits探测该类型是否为 IEEE-754 单精度或双精度static constexpr bool is_ieee_single_or_double (std::numeric_limitsnumber_float_t::is_iec559 std::numeric_limitsnumber_float_t::digits 24 std::numeric_limitsnumber_float_t::max_exponent 128) || (std::numeric_limitsnumber_float_t::is_iec559 std::numeric_limitsnumber_float_t::digits 53 std::numeric_limitsnumber_float_t::max_exponent 1024);若number_float_t是 IEEE 754 float 或 double即默认场景序列化走dump_float(number_float_t, std::true_type)借助nlohmann::detail::to_chars使用 Grisu2 类算法生成保证 round-trip往返无损的最短数字表示参见 serializer.hpp若number_float_t是long double等其它类型则走std::false_type分支按std::numeric_limitsnumber_float_t::max_digits10给出的位数用snprintf的%.*g对long double为%.*Lg完成格式化从而保证文本→浮点→文本往返不丢精度参见 serializer.hpp。这段代码同时也印证了原文档中本实现完全采用双精度方案与期望精度不超过 IEEE-754 binary64 即可获得良好互操作的描述默认路径就是为 IEEE float/double 量身优化的。自定义浮点类型替换 NumberFloatType既然number_float_t只是模板参数NumberFloatType的别名开发者完全可以用自己的类型实例化basic_json。例如需要更高精度时可改用long double#include nlohmann/json.hpp #include map #include vector // 将默认 double 替换为 long double 的 json 类型 using json_ld nlohmann::basic_json std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, long double;此时json_ld::number_float_t就是long double凡是解析进json_ld的小数都会以扩展精度存储序列化会自动切换到上文std::false_type的snprintf路径保证 round-trip请注意自定义类型必须满足std::numeric_limits可探测的算术浮点特性且 JSON 本身就是文本交换格式——自定义浮点类型带来的精度增益只发生在单进程内的解析→运算→序列化环节跨端交换时仍受对方实现精度约束。相关能力的延伸阅读number_float_t在实际使用中通常配合以下成员出现类型判别is_number_float()json.hpp用于判断某值是否为浮点 JSON 值而is_number()json.hpp则同时覆盖整数、无符号整数与浮点数取值与转换getdouble()、getfloat()等取值接口在目标类型为浮点时会读取内部number_float字段数值比较与运算比较运算符与算术运算符在整数、无符号整数与number_float_t之间做了大量混合运算的静态转换例如 json.hpp 中的对应重载同时 json.hpp 表明 NaN 参与比较时遵循NaN 与任何数值都不相等的语义。版本历史number_float_t自库的 1.0.0 版本起即已存在属于最基础的公开 API 之一其语义在后续版本中保持稳定序列化细节、Grisu2 最短表示等输出优化在后续版本持续演进。【免费下载链接】jsonJSON for Modern C项目地址: https://gitcode.com/GitHub_Trending/js/json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

WandEnhancer 三步解锁 WeMod Pro:本地补丁工具完整上手教程

WandEnhancer 三步解锁 WeMod Pro:本地补丁工具完整上手教程

WandEnhancer 三步解锁 WeMod Pro:本地补丁工具完整上手教程 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 用 WeMod 免费版每天被倒计…

📅 2026/10/14 1:28:51
开源AI编码代理opencode完全指南:安装、配置与实战

开源AI编码代理opencode完全指南:安装、配置与实战

上周末收到一条私信,对方把 PowerShell 整屏红字截图甩过来,内容是“opencode : 无法将‘opencode’项识别为 cmdlet、函数、脚本文件或可运行程序的名”。这不是我第一次被问到同一行报错。从 2025 年下半年开始,opencode 这个开源 AI 编码代…

📅 2026/10/4 18:30:28
用Docker部署ERPNext V15:从架构原理到生产落地的完整指南

用Docker部署ERPNext V15:从架构原理到生产落地的完整指南

先把结论放这里:用 Docker 部署 ERPNext V15 这件事,本身没有想象中那么难。官方把 image、编排文件、初始化脚本都准备好了,你在服务器上装好 Docker 和 Compose 插件之后,照着官方文档一步步来,大概率几个小时就能把…

📅 2026/10/5 7:29:19
MORE NEWS

更多资讯

📰

汝州市电工证办理流程全解析,怕考不过白交培训费?看这里

汝州市电工证办理流程全解析,怕考不过白交培训费?看这里 怕考不过白交培训费?别急,这波操作你得先搞清楚。在汝州市,电工证不仅 全国通用…

📰

电工证爬杆操作视频全流程办理指南:实操考试心里没底怕挂科?官方报名入口全解析

电工证爬杆操作视频全流程办理指南:实操考试心里没底怕挂科?官方报名入口全解析 实操考试心里没底怕挂科?你不是一个人。尤其是像你这样的开封中小施工企业负责人,不仅要自己考证,还要安排员工考,稍有不慎就可能耽误项目进度。别急,本文就从…

📰

低压电工证配备最新政策解读:学历不高怕报不上名?官方报名入口全攻略

低压电工证配备最新政策解读:学历不高怕报不上名?官方报名入口全攻略 你是不是也经常听见身边人说“低压电工证配备太难,学历不够根本没戏”?其实不然,越来越多的转岗人员,比如我身边刚从矿上下来的同事,也成功考下了低压电工证,现在在工地上干得风生…

📰

初级电工证接线千万别踩坑!工地太忙根本没时间复习考试

初级电工证接线千万别踩坑!工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是多少电工朋友的真实写照。尤其是那些刚刚拿到初级电工证接线的工友,一边要赶工期,一边还要担心证书复审和年审的事情,真的让人焦头烂额。别急,今天我们就来聊聊…

📰

广东省报名特种作业操作证在哪考 有证才能找到好工作

广东省报名特种作业操作证在哪考 有证才能找到好工作 你有没有遇到过这种情况:明明有能力,但因为没有特种作业证,连面试机会都没有?这在广东省的建筑、制造等行业特别常见。特种作业操作证不仅是上岗的通行证,更是薪资、晋升、职业稳定性的关键。现在就…

📰

赤峰电工证报名时间怎么考,学历不高也能拿全国通用的证

赤峰电工证报名时间怎么考,学历不高也能拿全国通用的证 你是不是也在担心自己学历不高,报不了电工证?别急, 赤峰电工证报名时间 其实每年都有固定安排,而且现在证书是 全国通用 的,只要你符合条件,完全可以通过正规渠道报考。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬