10. JSON 转换中的精度问题

JSON 转换中的精度问题

因为 JavaScript 语言问题,数字大于 16 位后,会丢失 16 位以后的数字:比如声明 let n = 1234567890123456789;打印 n 之后会显示 1234567890123456800;

同理 JSON.parse 将 json 字符串转为 Object 时,如果其中有大数字的值,也会发生精度丢失问题。

语法

JSON.parse(text)
/**
 * reviver 如果是函数,则规定了最初由解析产生的每个值在返回前的转换方式。不可调用的值将被忽略。
 */
JSON.parse(text, reviver)
const json = `{
  "bigNumber": 1234567891234567891234567891323236565
}`

const obj = JSON.parse(json)
const bigObj = JSON.parse(json, (key, value, context) => {
  if (key === 'bigNumber') {
    // 忽略值,它已经损失了精度
    return BigInt(context.source)
  }
  return value
})

console.log(obj) // { bigNumber: 1.2345678912345678e+36 }
console.log(bigObj) // {bigNumber: 1234567891234567891234567891323236565n}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值