2012-03-10 13 views
54

Zastanawiam się, czy JavaScript jest niewłaściwe 64-bitowych liczb całkowitych lub czy robię coś nie tak?JavaScript nie obsługuje 64-bitowych liczb całkowitych, prawda?

Mam następujący kod:

var str = "0x4000000000000000"; //4611686018427387904 decimal 
var val = parseInt(str); 
alert(val); 

uzyskać to wartości: "4611686018427388000", który jest 0x4000000000000060

+0

Powiązane: [Co to jest JavaScript Max Int? Jaka jest najwyższa wartość Integer, do której liczba może przejść bez utraty precyzji?] (Http://stackoverflow.com/questions/307179) – hippietrail

Odpowiedz

61

JavaScript reprezentuje liczby osób korzystających IEEE-754 podwójnej precyzji (64-bitowy) format. Jak rozumiem, daje to 53-bitową precyzję lub piętnaście do szesnastu cyfr dziesiętnych. Twój numer ma więcej cyfr niż JavaScript, więc możesz skończyć z przybliżeniem.

To nie jest tak naprawdę "niewłaściwe postępowanie" jako takie, ale oczywiście nie jest bardzo pomocne, jeśli potrzebna jest pełna precyzja na dużych liczbach. Istnieje kilka bibliotek JS, które mogą obsługiwać większe liczby, na przykład BigNumber i Int64.

+1

Myślę, że edytowałem jedno rozwiązanie w mojej odpowiedzi podczas pisania komentarza: możesz użyć biblioteka, która zajmie się dla Ciebie. (Nigdy nie musiałem obsługiwać tak dużych liczb w JS, z wyjątkiem sporadycznych zastosowań jako identyfikatorów rekordów, w którym to przypadku nie musiałem wykonywać operacji matematycznych na nich, więc utrzymywanie ich jako łańcuchów działało bez zarzutu.) – nnnnnn

+2

Zamknięcie to goog.math.Long może być również pomocny: http://docs.closure-library.googlecode.com/git/class_goog_math_Long.html –

+20

Należy dodać, że operacje na poziomie bitowym są ograniczone do 32-bitowych IIUC. – sellibitze

Powiązane problemy