我从 FortiSandbox API 收到一个 json 响应,我可以在网络选项卡中看到从 API 返回的值是 6994689367114128661,但是当我使用它发送它或到 console.log() 时值更改为 6994689367114128000。
收到服务器的响应后,我立即控制台。记录了该值,它发生了变化。
我的 jQuery 代码
fetch(apiUrl, requestOptionsJobID)
.then(responsegetJobStatus => {
if (!responsegetJobStatus.ok) {
throw new Error('Network response was not ok');
}
return responsegetJobStatus.json();
})
.then(getJobIDResult => {
var ok = getJobIDResult.result.status.message;
if (ok == 'OK') {
var getJobJid = getJobIDResult.result.data.jids[0];//here is where the value changes to 6994689367114128000
console.log(getJobJid);//shows the changed value
}
return getJobIDResult;
}).catch(error => {
console.error('Eroare get job ID: ', error);
});
来自 API 的具有所需 jid 值的 API 响应
{
"id": 17,
"ver": "2.0",
"result": {
"url": "/scan/result/get-jobs-of-submission",
"status": {
"code": 0,
"message": "OK"
},
"data": {
"jids": [
6994689367114128661
],
"total_jids": 1
}
}
}
发生的情况是您收到的数字太大,无法由 JavaScript 完全处理。当接收到更大的数字时,它会失去精度。无需详细说明,这里有一个简单的示例:
假设 Javascript 只能“记住”10 位数字。它可以轻松处理 235 或 1,235,038 等数字,但不能处理 123,123,456,456,因为它有 12 位数字。为了保持一定的准确性,javascript将只取前10位数字并记住它丢弃了多少个数字:1,231,234,564,因为它去掉了2位数字(将数字除以100、10^2或e2),它能够显示数字仍然如此,但只有 10 个最大的数字才是准确的,所以结果会是这样的:1,231,234,564e2 = 123,123,456,400
这正是您所经历的。 Number.MAX_SAFE_INTEGER 值给出了 Javascript 可以精确处理的最大数字。超过这个值,它将开始失去精度。在下面的 console.log 中,您可以看到最大的安全整数,然后比较您的数字是否大于它,然后再次看到 Javascript 看到的数字。
console.log(Number.MAX_SAFE_INTEGER, 6994689367114128661 > Number.MAX_SAFE_INTEGER, 6994689367114128661);
那么现在我们该如何解决这个问题呢?最好的办法是将 JSON 数字转换为字符串。您将使用 .text() 方法而不是 JSON 并操作文本以引用其中的数字。然后解析 JSON 会将 ID 处理为字符串而不是数字,因为字符串的处理方式与数字完全不同,因此您将保留与收到的值相同的值。