Subtrahieren von langen Zahlen in Javascript

8

Warum ist q == 0 im folgenden Skript?

%Vor%

Ich würde denken, das Ergebnis sollte 10 sein. Was ist der richtige Weg, um diese beiden Zahlen zu subtrahieren?

    
Eric 12.01.2010, 15:37
quelle

3 Antworten

18

Weil Zahlen in JavaScript Fließkommazahlen sind. Sie haben eine begrenzte Präzision.

Wenn JavaScript eine sehr lange Zahl sieht, wird sie auf die nächste Zahl gerundet, die als 64-Bit-Gleitkommazahl dargestellt werden kann. In Ihrem Skript werden start und end auf denselben Wert gerundet.

%Vor%

Es gibt keine integrierte Möglichkeit, arithmetische Berechnungen für große Ganzzahlen durchzuführen. Sie können jedoch eine BigInteger-Bibliothek wie dieser .

    
Jason Orendorff 12.01.2010, 15:39
quelle
3

Jason hat bereits das Warum gepostet. Für eine Lösung können Sie eine Javascript BigInt Bibliothek bei Ссылка

erhalten     
Michael Bray 12.01.2010 15:41
quelle
0

Es wird in der JavaScript-Dokumentation erläutert:

  

Nach dem ECMAScript-Standard gibt es nur einen Zahlentyp: das 64-Bit-Binärformat IEEE 754 mit doppelter Genauigkeit (Zahlen zwischen -(2 53 -1) und 2 53 -1 ). Es gibt keinen speziellen Typ für Ganzzahlen.

Wikipedia-Seite über Gleitkomma-Format mit doppelter Genauigkeit erklärt:

  

Zwischen 2 52 = 4,503,599,627,370,496 und 2 53 = 9,007,199,254,740,992 die darstellbaren Zahlen sind genau die ganzen Zahlen. Für den nächsten Bereich, von 2 53 bis 2 54 , wird alles mit 2 multipliziert, also sind die darstellbaren Zahlen die geraden usw.

(Alle ganzen Zahlen kleiner als 2 52 werden genau dargestellt.)

1234567890123456789 und 1234567890123456799 sind größer als 2 60 = 1152921504606846976 . Bei dieser Größe werden nur etwa 1% der ganzen Zahlen genau unter Verwendung des Gleitkommaformats mit doppelter Genauigkeit gespeichert.

Diese beiden können nicht genau gespeichert werden. Beide sind auf 1234567890123456800 gerundet.

In der JavaScript-Dokumentation wird außerdem erläutert, wie eine Ganzzahl angegeben werden kann ist genau gespeichert:

  

[...] und beginnend mit ECMAScript 6, können Sie mit Number.isSafeInteger() sowie Number.MAX_SAFE_INTEGER und Number.MIN_SAFE_INTEGER . Jenseits dieses Bereichs sind Ganzzahlen in JavaScript nicht mehr sicher und werden eine Gleitkomma-Approximation mit doppelter Genauigkeit des Wertes sein.

    
axiac 20.01.2018 09:26
quelle