首頁 > web前端 > js教程 > 為什麼 JavaScript JSON 解析中大數會被錯誤捨去?

為什麼 JavaScript JSON 解析中大數會被錯誤捨去?

Susan Sarandon
發布: 2024-12-20 14:40:13
原創
999 人瀏覽過

Why are large numbers incorrectly rounded in JavaScript JSON parsing?

JavaScript 中大數字被錯誤地進行舍入

問題:

問題:
var jsonString = '{"id":714341252076979033,"type":"FUZZY"}';
var jsonParsed = JSON.parse(jsonString);
console.log(jsonString, jsonParsed);
登入後複製

在下面這段程式碼中:
Object>
登入後複製

在Firefox 3.5 中,jsonParsed 的值是一個被舍入的數字:

我嘗試了不同的值,但始終得到舍入的數字。

我也不明白它的捨入規則。 714341252076979136 被捨去為 714341252076979200,而 714341252076979135 被捨入為 714341252076979100。 這是為什麼?

答案:

你溢位了JavaScript 數位類型的容量,請參閱規範的第8.5 節和維基百科上關於IEEE-754 雙精確度二元浮點格式的頁面以了解詳細資訊。這些 ID 需要是字串。

IEEE-754 雙精確度浮點(JavaScript 使用的數位類型)不能精確地表示所有數字(當然)。 0.1 0.2 === 0.3 為 false 這很有名。這會影響整數,就像它影響分數一樣;它從 9,007,199,254,740,991(Number.MAX_SAFE_INTEGER)開始。

超過 Number.MAX_SAFE_INTEGER 1(9007199254740992),IEEE-754 浮點格式就無法再表示每個連續的整數。 9007199254740991 1 是 9007199254740992,但 9007199254740992 1 也是 9007199254740992,因為 90071992547199254740992,因為 900719925477199934740992,因為 9007199254774007。下一個可以表示的是 9007199254740994。則不能表示 9007199254740995,但可以表示 9007199254740996。

原因是我們用完了位,所以我們不再擁有 1s 位;最低位的位現在代表 2 的倍數。最終,如果我們繼續下去,我們會失去該位並且只能以 4 的倍數工作。以此類推。

const jsonString = '{"id":"714341252076979033","type":"FUZZY"}';
// 注意它是一个字符串 -----------^

const obj = JSON.parse(jsonString, (key, value) => {
    if (key === "id" && typeof value === "string" && value.match(/^\d+$/)) {
        return BigInt(value);
    }
    return value;
});

console.log(obj);
登入後複製
你的值遠高於該閾值,因此它們被舍入為最接近的可表示值。

從 ES2020 開始,你可以用 BigInt 來表示任意大的整數,但沒有 JSON 表示它們。你可以使用字串和一個恢復器函數:(在真正的控制台中查看,片段控制台不理解 BigInt。)

以上是為什麼 JavaScript JSON 解析中大數會被錯誤捨去?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板