返回知识中心
平台

JavaScript Number 精度与跨运行时可移植性

在 IEEE-754、BigInt、JSON 序列化和运行时回退之间保持数值可靠。

BotBrowser Team

文档中心

想直接进入 平台 文档吗?

这篇文章属于博客内容库。若你要步骤化配置、参考说明和持续更新,请直接进入对应 docs 分区。

数值可移植性是数据合同问题。同一个值经过表单、JavaScript、JSON、worker 和服务时,每个边界都可能改变表示。Number 遵循 IEEE-754 binary64,许多小数和大整数不能精确表示。比较运行时前,应先定义每个边界的表示方式。

表示边界

当范围和舍入规则适合 binary64 时使用 Number。Number.MAX_SAFE_INTEGER 是 2^53 - 1,应在运算前用 Number.isSafeInteger 检查。BigInt 支持任意大小整数,但不支持小数,不能与 Number 隐式混算。大标识符应保持字符串或 BigInt,并拒绝含义不清的转换。

MDN Number 参考与 MDN BigInt 参考说明语言行为,并不证明业务金额正确。业务合同需要应用自己定义和测试。

安全整数与舍入

定义舍入模式、单位和边界。Math.round 不是通用财务政策,负数半值尤其需要明确规则。需要精确时使用缩放整数或十进制字符串。显示格式与存储值分离;Intl.NumberFormat 只生成本地化视图。

测试负数、半值、极大和极小输入。一个整数转成不安全 Number 后,丢失的位无法恢复。

JSON 与序列化

JSON 没有 BigInt 类型。没有明确策略时,JSON.stringify({ amount: 1n }) 会失败。可以使用 { "kind": "bigint", "value": "9007199254740993" } 这样的带标签结构,先验证标签和范围,再构造 BigInt。精确小数应传输声明了缩放和符号的字符串,而不是含义不明的 JSON 数字。

在窗口、worker 和服务中测试安全整数、第一个不安全整数、0.1 + 0.2、负半值和 64 位标识符。比较规范化表示和业务结果,而不是 JSON 空白。

跨运行时回退

探测真实处理路径,记录 bigint-json-adapter-v2 这样的能力,不记录浏览器身份。如果适配器不可用,应重新读取原始字符串,选择字符串路径或使用相同 schema 的服务。Number 一旦丢失位,不能靠回退重建原值。

BotBrowser 支持在记录的管线中运行授权的数值表单、序列化和可重复比较流程,但不能改变 IEEE-754、增加十进制运算,也不能证明业务计算正确。能力说明见 BotBrowser 高级功能。

输入与证据

解析前创建任务记录,保留文本、符号、缩放和 schema。使用边界夹具、取消、worker 重启、错误标签和旧接口。诊断记录阶段与版本,不记录余额。回退时播报路径变化、保留焦点并让用户继续编辑。参考浏览器版本验证和兼容性回退指南。

固定发布记录

发布 schema、示例、解析器、序列化器、舍入模式、回退、上下文和预期结果。分开记录精度与耗时,保留旧 JSON 拒绝 BigInt 及带标签适配器成功的负面证据。修正创建新的不可变记录。流程是定义表示、保护边界、显式序列化、探测、回退并固定证据。

客户端合同应先选择规范化形式。

前导零可能属于标识符的一部分。

舍入只在声明的边界执行一次。

本地化显示不应替代存储值。

表示变化时应保留符号。

每个传输小数都应带有缩放规则。

超范围值应产生可恢复状态。

用户可以修改字段而无需重新输入。

适配器切换路径时保留原始输入。

服务收到与其匹配的 schema。

窗口和 worker 使用相同规范化示例。

解析器先验证再转换。

序列化器拒绝未声明类型。

JSON 响应保持相同缩放。

比较同时检查类型和结果。

测试包含负值。

测试包含精确半值。

测试包含接近边界的整数。

测试包含带前导零的字符串。

测试包含空输入。

测试包含未知标签。

取消后原始来源仍然可用。

worker 重启不应改变合同。

缓存使用规范化形式。

升级保留旧的兼容路径。

文档同时展示接受和拒绝的示例。

界面播报选中的回退。

可见输出说明单位。

支持记录阶段和版本,不记录私有值。

数值输入经过表示边界到达已验证结果。

公开来源

#JavaScript#数字精度#BigInt#可移植性

让 BotBrowser 从研究走向生产

先用这些指南理解模型,再进入跨平台验证、隔离上下文和面向规模化的浏览器部署。