Warum wird diese Nummer um eins erhöht? [Duplikat]

8

%Vor%

Warum gibt dieser Code eine Nummer größer aus (10209761399365908 statt 10209761399365907)?

Dies geschieht nur für diese spezifische Nummer. Zum Beispiel mit 10155071933693662 bekomme ich den richtigen Wert (10155071933693662).

Gibt es etwas, das ich über diese spezifische Nummer wissen muss? Die einzige Problemumgehung, die ich herausgefunden habe, besteht darin, den Wert als Zeichenfolge zu übergeben.

    
Ziba Leah 29.11.2016, 13:54
quelle

1 Antwort

18

Ihr numerischer Wert ist zu groß, um genau als 64-Bit Gleitkommazahl dargestellt zu werden. Der Wert, den Sie erhalten, ist eine Annäherung. JavaScript hat nativ nur 64-Bit Fließkommazahlen; Werte, die tun in ein long in C oder C ++ passen, sind möglicherweise zu groß, um genau dargestellt zu werden, da einige der 64 Bits für einen Exponenten in Gleitkommadarstellung verwendet werden. (Der Kompromiss besteht darin, dass es mit Fließkomma möglich ist, mit Approximationen für Werte mit viel größer oder kleinerer numerischer Größe als mit einfacher Ganzzahldarstellung zu arbeiten.)

Wenn es nicht wichtig ist, den Wert als Zahl zu manipulieren, machen Sie eine Zeichenfolge:

%Vor%

oder wie ich für die Frage vorgeschlagen habe, wie sie ursprünglich erschienen ist:

%Vor%

wo diese "FacebookID" die große Nummer in Frage war.

Es gibt eine Konstante (in neueren JavaScript-Umgebungen) namens Number.MAX_SAFE_INTEGER . Das sagt Ihnen, wie groß eine Zahl sein kann, damit der Wert genau dargestellt wird; Das heißt, dass die 64-Bit Fließkomma-Mantisse explizite Bits für den gesamten Wert enthält.

Größere gerade Ganzzahlen können genau dargestellt werden, abhängig davon, wie viele Null-Bits am unteren Ende ihrer Binärdarstellung sind. Somit kann 1152921504606846800 genau dargestellt werden, da es am unteren Ende der Binärdarstellung 7 Bits aller Nullen hat. % Co_de% wird jedoch als 1152921504606846801 ausgegeben, weil das niedrige 1152921504606846800 -Bit nirgendwo hinkommt. (Nicht dargestellte Bits werden als Null angenommen.)

Addendum: Hier ist die (fast) ursprüngliche Version der gestellten Frage, um den möglicherweise verwirrenden Beispielcode oben zu erklären:

Ich habe ein Problem mit Javascript, das ziemlich komisch ist. Ich habe einige IDs von meinem Server und wenn ich eine Taste drücke, wird der Parameter an eine Methode übergeben, um eine Anfrage auszuführen.

Dies ist der Code:

%Vor%

Andererseits habe ich:

(CSHTML-Syntax)

%Vor%

Das wurde:

%Vor%

Aber wenn ich auf den Knopf ... klicke, erhält die Nummer der Methode den um 1 erhöhten Parameter!

Und das passiert NUR für eine bestimmte ID! Zum Beispiel mit 10155071933693662 bekomme ich den richtigen Wert (10155071933693662)

Gibt es etwas, das ich über diese spezifische Nummer wissen muss? All das ist wirklich seltsam und die einzige Problemumgehung, die ich herausgefunden habe, besteht darin, den Wert als String zu übergeben!

    
Pointy 29.11.2016, 13:56
quelle

Tags und Links