JavaScript 中大數字被錯誤地進行舍入
問題:
問題:var jsonString = '{"id":714341252076979033,"type":"FUZZY"}'; var jsonParsed = JSON.parse(jsonString); console.log(jsonString, jsonParsed);
Object>
我嘗試了不同的值,但始終得到舍入的數字。
我也不明白它的捨入規則。 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);
以上是為什麼 JavaScript JSON 解析中大數會被錯誤捨去?的詳細內容。更多資訊請關注PHP中文網其他相關文章!