Postman大整数精度丢失源于V8引擎的IEEE 754双精度限制,安全整数上限为9007199254740991;解决方式包括JSON中用字符串表示、脚本中全程字符串操作、后端同步适配反序列化逻辑。

Postman 本身不处理 JSON 数值解析,大整数精度丢失问题出在 JavaScript 引擎(V8)里,不是 Postman 的 bug,也改不了——你填进去的 9223372036854775807,在 Pre-request Script 或 Tests 里一读取,就可能变成 9223372036854776000。
为什么 Postman 里大整数会变样
Postman 的脚本环境基于 Chromium 的 V8 引擎,所有数字统一用 IEEE 754 双精度浮点数表示。JavaScript 没有原生 long 或 bigint(除非显式用 BigInt("...")),而双精度能安全表示的最大整数是 Number.MAX_SAFE_INTEGER(即 9007199254740991)。超过这个值,低位就会“四舍五入”丢精度。
常见现象包括:
- 你在 Body → raw → JSON 里写
"id": 9223372036854775807,发送后服务端收到的是9223372036854776000 - Pre-request Script 中用
pm.variables.set("id", 9223372036854775807),再取出来就失真 - Tests 里用
JSON.parse(responseBody)解析含大整数的响应,id字段自动转成近似值
Postman 中保留大整数的三种实操方式
核心原则:绕过 JS 数值解析,全程当字符串处理。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
-
Body 中直接写字符串:在 raw → JSON 模式下,把大整数字段写成字符串,例如
"order_id": "12345678901234567890"。这是最简单、最可靠的方式,前提是后端接口接受字符串格式的 ID -
Pre-request Script 里用字符串拼接:不要用 JS 数字字面量赋值,改用字符串变量或环境变量:
pm.variables.set("big_id", "9223372036854775807");然后在 Body 中引用:"id": "{{big_id}}" -
动态构造 JSON 字符串(慎用):如果必须在脚本里生成整个 payload,别用
JSON.stringify()直接序列化含数字的对象,改用模板字符串:const payload = `{"id": "${pm.variables.get("big_id")}", "name": "test"}`;再用pm.request.body.update({ mode: 'raw', raw: payload });
后端配合要点与常见翻车点
光前端处理不够,后端反序列化逻辑必须同步适配,否则照样出错。
- Spring Boot 默认用 Jackson,需配置
DeserializationFeature.USE_BIG_DECIMAL_FOR_INTS或自定义JsonDeserializer,否则字符串 ID 会被拒或转成 0 - .NET 后端若用
System.Text.Json,默认不支持字符串转long,得加JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString - 别在 Tests 里对大整数做数值比较:
response.json().id === 9223372036854775807必败;应改为字符串比:String(response.json().id) === "9223372036854775807" - Postman 的
pm.response.json()会强制解析数字,导致精度丢失;如需原始值,改用pm.response.text()+ 手动JSON.parse(..., (k,v) => typeof v === 'string' && /^\d+$/.test(v) ? v : v)做懒解析
真正容易被忽略的是:Postman 的「自动补全」和「历史请求回填」功能,会在你编辑 raw JSON 时悄悄把长数字转成科学计数法或截断显示——看起来没变,实际已失真。每次修改后务必检查原始文本,别信预览框。










