大整数精度错误在Bash命令输出渲染中的问题
问题描述
Claude Code在显示bash命令输出中的大整数时出现错误,显示的值与实际命令输出的值不同。
重现步骤
运行以下命令在Claude Code中:
|
|
或使用jq:
|
|
预期行为
Claude Code应显示:348555896224571969
实际行为
Claude Code显示:348555896224571970(相差1)
验证
在原生终端中运行相同命令正确输出:348555896224571969
环境信息
- Claude Code版本:v2.0.37
- 模型:Sonnet 4.5 (Claude Max)
- 平台:macOS (Darwin 24.3.0)
根本原因分析
根据调查,问题根源在于JavaScript数字精度限制:
- Claude Code CLI二进制文件使用Bun(JavaScript运行时)构建
- 当从bash命令接收输出时,它通过JavaScript解析JSON/文本
- JavaScript的Number类型使用64位IEEE 754浮点数
- 只能安全表示最大到2^53 - 1 = 9,007,199,254,740,991的整数
- 数字348,555,896,224,571,969远超此限制
- 当JavaScript解析此数字时,会丢失精度并四舍五入到最接近的可表示值
问题流程
- Bash正确输出:348555896224571969
- Claude Code的JavaScript/TypeScript代码解析此输出
- JavaScript将其转换为Number,丢失精度 → 348555896224571970
- 此错误值显示给用户
解决方案
Claude Code需要以不同方式处理大整数:
- 在整个处理流程中将大数字保持为字符串
- 对可能超过Number.MAX_SAFE_INTEGER的整数值使用BigInt
- 使用能够处理大整数的自定义JSON解析器选项
更新状态
开发团队确认此错误仅影响TUI中数字的显示,不影响模型看到的原始bash结果。修复将在下一个版本左右发布。