转换JavaScript二进制字符串并再次返回是不相等的

Mar*_*ter 3 javascript binary decimal

我有一个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
Run Code Online (Sandbox Code Playgroud)

我希望str2是相同的str1,事实并非如此.

T.J*_*der 6

在JavaScript中,Number类型是64位双精度值(更多,更多).你已经在那里指定了64位,这超出了64位双精度值可以精确指定的范围(因为它是浮点类型,因此必须将一些位用于精度).JavaScript没有整数类型(更不用说64位版本),这是完美保真度转换所需要的.

我不是那么浮点位表示,但是IIRC 64位双精度数可以准确地表示大约53位有效位的整数值,详见链接.