2013-11-26 5 views
6

Dies ist ein seltsames Problem, das ich gegenüberstelle. Als ich einige großen Zahlen zu JS-Funktionen (benutzerdefinierte oder integrierte) übergeben wird der Wert automatisch um 1. Zum Beispiel erhöht zu werden, sieht folgendermaßen aus:Problem mit einigen großen Zahlen in Java Script

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to display an alert box.</p> 

<button onclick="myFunction()">Try it</button> 

<script> 
function myFunction() 
{ 
alert(10466511635124471); 
} 
</script> 

</body> 
</html> 

in der Warnung ich 10466511635124472 bin zu sehen, statt 10466511635124471 . Kann jemand dieses Verhalten erklären?

Ich habe dies überprüft in FF 17.0.10 und Chrome 12.0.742.122 und IE 8.

+0

Sehen Sie hier http zu bekommen: // Floating-Point- gui.de/ – elclanrs

+0

im Grunde es inkrementieren alle ungeraden nummer mit vorgegebenen bereich ... versuch 10466511635124472 es wird korrekte werte zeigen, dass was ich beobachte. Ehrlich gesagt, ich weiß nicht warum –

+0

@Arun: Nicht unbedingt, das ist irreführend. –

Antwort

1

Dies ist mit der Art der IEEE754 double-precision 64-bit floating point math (all compliant JavaScript implementations use this form of IEEE arithmetic) zu tun - Ihre Nummer 10 466 511 635 124 471 ist größer als die höchste positive ganze Zahl, die als fortlaufende Zahlen darstellbar ist, die 2 (9 007 199 254 740 992) ist. Die 64 Bits einer Zahl in JavaScript werden unter Verwendung von 1 Bit für das Vorzeichen, 52 Bits für die Zahl (spezielles Verhalten für Exponenten ergibt effektiv 53 Bits Genauigkeit) und 11 Bits für den Exponenten dargestellt, weshalb dies der Fall ist.

Wenn Ihre Anzahl diese maximale Anzahl überschreitet, wird ein Exponent von größer als 1 verwendet, um dies darzustellen, was zu einer kleinstmöglichen Repräsentationsabsenkung führt. Mit einem Exponenten von zwei (wie es in Ihrem Fall dargestellt ist), wird die kleinste differenzierbare Änderung der Zahlen zwei sein, und weil Ihre Zahl zwischen diesen beiden liegt, wird sie auf die nächste gerundet.

JavaScript hat keine beliebige Größe Integer-Format, noch Unterstützung ähnlich wie BigNum für alles hat (die Java-Begriff zu verwenden) oder beliebiger Genauigkeit Arithmetik. Wenn Sie größere Zahlen speichern möchten, müssen Sie eine andere Methode zum Speichern verwenden, z. B. Strings.

1:ich Wikipedia verknüpft haben als die eigentliche Spezifikation Geld kostet, um legal/zu erhalten offiziell - wenn jemand eine bessere Quelle hat Sie bearbeiten in

2

Javascript hat keine. Unterstützung für große Ganzzahlen. Es verwendet 64-Bit-Gleitkommazahl, um die Zahl, die Genauigkeit, das Vorzeichen und den Exponenten zu speichern.

Eine gute Praxis ist Stringdarstellungen dieser Zahlen zu verwenden:

alert("10466511635124471"); 

Hinweis Diese JSON-Antwort von Facebook Graph API: Alle maßen Zahlen, die kleiner als 32 Bit-Integer ganze Zahlen sind wäre noch, aber als Facebook-Nutzer 64-Bit-Integer als ids, haben sie in Strings umgewandelt worden:

http://graph.facebook.com/cocacola

-1

Größte positive Zahl erlaubt in Javascript ist 1.79E + 308.

Sie eine Reihe genommen haben (10466511635124471), die größer ist als die larget ist + ve number.May sein, dies der Grund ist, die Antwort als 10466511635124472.