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

JavaScript中JSON.stringify丢失末尾零的解决办法及替代库咨询

解决JSON.stringify保留数值末尾零的问题

JSON 本身不区分整数和浮点数,而 JavaScript 的 JSON.stringify 会将 6.0 这类值序列化为 6——因为在 JS 中 6 和 6.0 是同一个 Number 类型值。要实现输出带末尾零的数值格式,可以用以下两种方案:

一、自定义序列化逻辑(无需第三方库)

1. 针对特定字段的正则替换

如果明确知道哪些字段需要保留末尾零,可以先序列化再用正则修改结果:

const data = { x: 5, y: 6.0 };
let jsonStr = JSON.stringify(data);
// 替换y字段的整数为带.0的数值格式
jsonStr = jsonStr.replace(/"y":(\d+)/, '"y":$1.0');
console.log(jsonStr); // 输出:{"x":5,"y":6.0}

2. 用标记对象区分数值类型

如果需要通用处理,可以给需要保留末尾零的数值添加标记,再通过 replacer 函数处理:

// 用包装对象标记需要保留小数位的数值
const data = {
  x: 5,
  y: { __isFloat: true, value: 6.0 }
};

function floatReplacer(key, value) {
  if (value?.__isFloat) {
    return `${value.value}.0`;
  }
  return value;
}

let jsonStr = JSON.stringify(data, floatReplacer);
// 把字符串形式的"6.0"转为数值格式
jsonStr = jsonStr.replace(/"(\d+\.0)"/g, '$1');
console.log(jsonStr); // 输出:{"x":5,"y":6.0}

二、使用第三方库

部分 JSON 处理库支持自定义数值序列化规则,比如结合 decimal.js 来精确控制输出格式:

const Decimal = require('decimal.js');

const data = {
  x: new Decimal(5),
  y: new Decimal('6.0')
};

// 先序列化为带字符串格式的数值
let jsonStr = JSON.stringify(data, (key, value) => {
  return value instanceof Decimal ? value.toString() : value;
});
// 去掉引号转为数值格式
jsonStr = jsonStr.replace(/"(\d+\.0)"/g, '$1');
console.log(jsonStr); // 输出:{"x":5,"y":6.0}

需要注意的是:即使输出了 6.0 格式的数值,用 JSON.parse 解析时仍会转回整数 6,这种处理仅适用于需要特定字符串格式的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:29