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.
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 hat bereits das Warum gepostet. Für eine Lösung können Sie eine Javascript BigInt Bibliothek bei Ссылка
erhaltenEs 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)
und2
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
und2
53
= 9,007,199,254,740,992
die darstellbaren Zahlen sind genau die ganzen Zahlen. Für den nächsten Bereich, von2
53
bis2
54
, wird alles mit2
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()
sowieNumber.MAX_SAFE_INTEGER
undNumber.MIN_SAFE_INTEGER
. Jenseits dieses Bereichs sind Ganzzahlen in JavaScript nicht mehr sicher und werden eine Gleitkomma-Approximation mit doppelter Genauigkeit des Wertes sein.
Tags und Links javascript long-integer subtract