【Qt】QJsonValue存储 int64 类型的大整数时,数值出现莫名其妙的变化
1、问题描述
在使用 QJsonValue 将 int64、uint64 类型的值转换成 json 字符串时,有时(数值很大时)数据的后几位会发生变化。
2、原因分析
JSON 规范中,数字类型默认使用==双精度浮点数(double)==表示,而双精度浮点数的有效精度只有 53 位二进制位(约 16 位十进制)。当整数超过这个范围时,会丢失精度,导致存储后的值发生变化。
3、扩展:int64 与 double 的存储特性
- int64:64 位有符号整数,范围是 [-2^63, 2^63 - 1](即 -9223372036854775808 到 9223372036854775807)。它采用精确存储,每个 bit 都用于表示整数的二进制位,没有精度损失。
- double:64 位双精度浮点数(遵循 IEEE 754 标准),结构为:
- 1 位符号位(正 / 负)
- 11 位指数位(表示数值的量级)
- 52 位尾数位(表示有效数字,实际精度为 53 位,因为有一个隐藏的默认位 1)。
- double的精度有限,只能精确表示二进制位数 ≤ 53 位的整数。
- qint64 转 double 时的最大精确值
- 能被 double 精确表示的最大整数是 2^53 - 1(即 9007199254740991)。