Heim > Web-Frontend > js-Tutorial > Warum werden große Zahlen beim JavaScript-JSON-Parsing falsch gerundet?

Warum werden große Zahlen beim JavaScript-JSON-Parsing falsch gerundet?

Susan Sarandon
Freigeben: 2024-12-20 14:40:13
Original
1066 Leute haben es durchsucht

Why are large numbers incorrectly rounded in JavaScript JSON parsing?

Große Zahlen werden in JavaScript falsch gerundet

Problem:

Unten in diesem Code:

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

in Firefox In 3.5 ist der Wert von jsonParsed eine gerundete Zahl:

Object>
Nach dem Login kopieren

Ich habe verschiedene Werte ausprobiert, aber immer eine gerundete Zahl erhalten.

Ich verstehe auch die Rundungsregeln nicht. 714341252076979136 wird auf 714341252076979200 gerundet, und 714341252076979135 wird auf 714341252076979100 gerundet.

Warum ist das so?

Antwort:

Sie überschreiten die Kapazität des numerischen JavaScript-Typs, siehe Abschnitt 8.5 der Spezifikation und Wikipedia zum IEEE-754-Gleitkomma mit doppelter Genauigkeit Weitere Informationen finden Sie auf der Formatseite. Diese IDs müssen Zeichenfolgen sein.

IEEE-754-Gleitkommazahl mit doppelter Genauigkeit (der von JavaScript verwendete Zahlentyp) kann (natürlich) nicht alle Zahlen exakt darstellen. 0,1 0,2 === 0,3 ist falsch Das ist berühmt. Dies betrifft ganze Zahlen genauso wie Brüche; es beginnt bei 9.007.199.254.740.991 (Number.MAX_SAFE_INTEGER).

Number.MAX_SAFE_INTEGER 1 (9007199254740992) wird überschritten und das IEEE-754-Gleitkommaformat kann nicht mehr jede aufeinanderfolgende ganze Zahl darstellen. 9007199254740991 1 ist 9007199254740992, aber 9007199254740992 1 ist auch 9007199254740992, da 9007199254740993 in diesem Format nicht dargestellt werden kann. Die nächstmögliche Darstellung ist 9007199254740994. Dann kann es nicht 9007199254740995 darstellen, wohl aber 9007199254740996.

Der Grund dafür ist, dass wir keine Bits mehr haben, sodass wir nicht mehr über die 1er-Bits verfügen. Das niedrigste Bit stellt jetzt ein Vielfaches von 2 dar. Wenn wir fortfahren, verlieren wir schließlich dieses Bit und arbeiten nur noch in Vielfachen von 4. Und so weiter.

Ihre Werte liegen deutlich über diesem Schwellenwert, daher werden sie auf den nächsten darstellbaren Wert gerundet.

Ab ES2020 können Sie BigInt verwenden, um beliebig große Ganzzahlen darzustellen, es gibt jedoch kein JSON, um diese darzustellen. Sie können Zeichenfolgen und eine Wiederherstellungsfunktion verwenden:

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);
Nach dem Login kopieren

(In der realen Konsole betrachtet versteht die Fragmentkonsole BigInt nicht.)

Das obige ist der detaillierte Inhalt vonWarum werden große Zahlen beim JavaScript-JSON-Parsing falsch gerundet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage