V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
iv8d

JSON.parse 转数字精度丢失问题

  •  
  •   iv8d · Oct 10, 2025 · 3430 views
    This topic created in 200 days ago, the information mentioned may be changed or developed.

    JSON.parse('{"a":273848723742834827340}') 结果为 {a: 273848723742834820000} 精度丢失了,这种除了转字符串还有什么方法。

    13 replies    2025-10-15 10:12:38 +08:00
    whusnoopy
        1
    whusnoopy  
       Oct 10, 2025
    没有,js 里的 number 只有这个精度
    ccccccc
        2
    ccccccc  
       Oct 10, 2025
    bzw875
        3
    bzw875  
       Oct 10, 2025
    前端别计算这个值了,JS 的 number 存不了。改成字符串吧 JSON.parse('{"a":"273848723742834827340"}')
    Ketteiron
        4
    Ketteiron  
       Oct 10, 2025
    字符串是相对最好的处理方法,推特碰上这个坑也是这么做的,有更好的方法早用了。
    UnluckyNinja
        5
    UnluckyNinja  
       Oct 12, 2025   ❤️ 1
    你在 js 直接用变量存这个数都保留不了这个精度,更不可能在 js 里序列化/反序列化 json 还能保留精度了,老老实实在 js 里用 bigint 或高精度库处理,在 json 里用字符串保存(数字明文或者数值转 base64 )
    uei
        6
    uei  
       Oct 12, 2025 via iPhone
    const obj = JSON.parse('{"a":"273848723742834827340"}');

    你打印 BigInt(obj.a)看看

    参考
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt
    iv8d
        7
    iv8d  
    OP
       Oct 12, 2025 via Android
    @UnluckyNinja 确实本身就无法保留,惭愧
    qwerthhusn
        8
    qwerthhusn  
       Oct 12, 2025
    twitter 提供的 API ,除了返回 id 字段外,还会返回一个 id_str
    AV1
        9
    AV1  
       Oct 12, 2025
    浮点数就是这样的,当数字大到一定程度的时候,连整数都不能精确表示了。
    要么改用 string ,要么用 BigInt
    xiangyuecn
        10
    xiangyuecn  
       Oct 13, 2025
    还好是发到了 JavaScript ,要是发到了 Java ,这锅就得你自己背了😂

    照我这点开发经验,数据库里面要么是 int 、要么就是字符串,其他的统统存字符串😂 时间特殊点可以存 bigint 毕竟精确到 ms 也不 big

    至于非自增 id ,感觉要是 UUIDv7 早出个 10 来年,用字符串都不用经过脑子思考了🤔
    moverinfo
        11
    moverinfo  
       Oct 13, 2025 via iPhone
    micean
        12
    micean  
       Oct 13, 2025
    @xiangyuecn java 不背这个锅。。。现在是很多人无脑上雪花,所以基本都是大数
    Opportunity
        13
    Opportunity  
       Oct 15, 2025
    MDN 上不就有现成的方案吗?

    const bigJSON = '{"gross_gdp": 12345678901234567890}';
    const bigObj = JSON.parse(bigJSON, (key, value, context) => {
    if (key === "gross_gdp") {
    return BigInt(context.source);
    }
    return value;
    });
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3261 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 123ms · UTC 14:07 · PVG 22:07 · LAX 07:07 · JFK 10:07
    ♥ Do have faith in what you're doing.