Преобразование двоичной строки JavaScript и обратно не равно - PullRequest
3 голосов
/ 09 января 2012

У меня есть массив из 64 элементов JavaScript, который я использую в качестве битовой маски. К сожалению, я столкнулся с проблемой при преобразовании строки в двоичный файл и обратно. Это сработало для некоторых других массивов, но что здесь происходит?

var a = [1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 0, 0, 1, 1, 1, 1,
         1, 1, 0, 0, 1, 1, 1, 1,
         1, 1, 0, 0, 0, 0, 1, 1,
         1, 1, 0, 0, 0, 0, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1,
         1, 1, 1, 1, 1, 1, 1, 1];

var str1 = a.join('');
  //-> '1111111111111111110011111100111111000011110000111111111111111111'

var str2 = parseInt(str1, 2).toString(2);
  //-> '1111111111111111110011111100111111000011110001000000000000000000'

str1 === str2  //-> false

Я бы ожидал, что str2 будет таким же, как str1, что не так.

1 Ответ

6 голосов
/ 09 января 2012

В JavaScript тип Number представляет собой 64-битное значение двойной точности ( больше и больше ). Вы указали там 64 бита, что выходит за рамки, которые может точно указывать 64-битное значение двойной точности (так как это тип с плавающей запятой , и поэтому некоторые биты должны выделяться с точностью). У JavaScript нет целочисленного типа (а тем более 64-битной версии), что и требуется для преобразования с идеальной точностью.

Я не слишком разбираюсь в представлениях битов с плавающей запятой, но IIRC 64-битное число с двойной точностью может точно представлять целочисленные значения порядка 53 значащих битов, подробности см. В ссылках. .

...