Home >Web Front-end >JS Tutorial >Why are large numbers incorrectly rounded in JavaScript JSON parsing?

Why are large numbers incorrectly rounded in JavaScript JSON parsing?

Susan Sarandon
Susan SarandonOriginal
2024-12-20 14:40:131046browse

Why are large numbers incorrectly rounded in JavaScript JSON parsing?

Large numbers are incorrectly rounded in JavaScript

Issue:

Below In this code:

var jsonString = '{"id":714341252076979033,"type":"FUZZY"}';
var jsonParsed = JSON.parse(jsonString);
console.log(jsonString, jsonParsed);

in Firefox In 3.5, the value of jsonParsed is a rounded number:

Object>

I tried different values ​​but always got a rounded number.

I don’t understand its rounding rules either. 714341252076979136 is rounded to 714341252076979200, and 714341252076979135 is rounded to 714341252076979100.

Why is this?

Answer:

You are overflowing the capacity of the JavaScript numeric type, see section 8.5 of the specification and Wikipedia on the IEEE-754 double-precision binary floating point format page for details. These IDs need to be strings.

IEEE-754 double-precision floating point (the number type used by JavaScript) cannot represent all numbers exactly (of course). 0.1 0.2 === 0.3 is false This is famous. This affects integers just like it affects fractions; it starts at 9,007,199,254,740,991 (Number.MAX_SAFE_INTEGER).

Number.MAX_SAFE_INTEGER 1 (9007199254740992) is exceeded, and the IEEE-754 floating point format can no longer represent each consecutive integer. 9007199254740991 1 is 9007199254740992, but 9007199254740992 1 is also 9007199254740992, because 9007199254740993 cannot be represented in this format. The next thing that can be represented is 9007199254740994. Then it cannot represent 9007199254740995, but it can represent 9007199254740996.

The reason is that we ran out of bits, so we no longer have the 1s bits; the lowest bit now represents a multiple of 2. Eventually, if we continue, we'll lose that bit and only work in multiples of 4. And so on.

Your values ​​are well above that threshold, so they are rounded to the nearest representable value.

Starting in ES2020, you can use BigInt to represent arbitrarily large integers, but there is no JSON to represent them. You can use strings and a restorer function:

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);

(Viewed in the real console, the fragment console does not understand BigInt.)

The above is the detailed content of Why are large numbers incorrectly rounded in JavaScript JSON parsing?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn