You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js如何在JSON文件中保留固定小数的科学计数法格式?

解决Node.js中JSON保留固定小数位科学计数法数字格式的问题

核心问题分析

JSON规范允许科学计数法格式的数字,但原生JSON.stringify不会按照固定小数位的科学计数法序列化数字——要么自动切换为普通十进制写法,要么省略末尾的零,无法满足下游应用的格式要求。同时,JSON字符串必须带双引号,因此“无引号的字符串形式”不符合JSON语法,只能实现数字类型的固定小数位科学计数法格式输出。

实现方案:自定义序列化+正则后处理

通过自定义JSON.stringify的replacer函数格式化数字,再用正则去掉多余的引号,得到符合要求的JSON内容:

代码示例

const fs = require('fs');

// 1. 读取并解析原始JSON
const rawData = fs.readFileSync('input.json', 'utf8');
const data = JSON.parse(rawData);

// 2. 修改目标值(示例:将value改为25678)
data.value = 25678;

// 3. 自定义replacer:将数字格式化为15位小数的科学计数法字符串
function formatSciNotation(key, value) {
  // 可根据需求调整:仅处理特定字段(如key为'value')或所有数字
  if (typeof value === 'number') {
    // toExponential(15)生成15位小数的科学计数法,replace确保指数部分带+号
    return value.toExponential(15).replace(/e(?=\d)/, 'e+');
  }
  return value;
}

// 4. 先序列化为带引号的科学计数法字符串
let jsonStr = JSON.stringify(data, formatSciNotation, 2);

// 5. 正则替换:去掉科学计数法字符串的双引号,转为合法的JSON数字格式
jsonStr = jsonStr.replace(/"(\d+\.\d{15}e\+\d{2})"/g, '$1');

// 6. 写入文件
fs.writeFileSync('output.json', jsonStr, 'utf8');

关键说明

  • toExponential(15):确保数字格式化为带15位小数的科学计数法,自动补全末尾的零,匹配示例中的格式。
  • 正则/"(\d+\.\d{15}e\+\d{2})"/g:精准匹配目标格式的字符串,替换后转为无引号的数字类型,符合JSON语法规范。
  • 若只需处理特定字段,可在replacer中添加key判断(如if (key === 'value' && typeof value === 'number')),避免影响其他数字。

验证

生成的JSON内容如下,可被下游应用正常解析:

{
  "value": 2.567800000000000e+04
}

内容的提问来源于stack exchange,提问作者fa__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:12:35