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);
in Firefox In 3.5 ist der Wert von jsonParsed eine gerundete Zahl:
Object>
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);
(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!