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

再次转换JavaScript二进制字符串是不相等的,javascript,binary,decimal,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,

我有一个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相同,但事实并非如此。

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


我对浮点数表示法不太了解,但IIRC一个64位双精度数字可以准确地表示53位有效位的整数值,详情请参见链接。

你失去了精度。请参阅。如果您使用更灵活的语言(如python),您可以看到这两个二进制字符串只差1个值<代码分别>18446691089982423040和
18446691089982423039。(正如@zie所说的精度)我只想说,在位掩码声音的字符串表示上使用parseInt。。。。相当愚蠢?如果您必须将其作为字符串表示,那么只做一些类似于
函数匹配掩码(str,pos){return str.charAt(pos)!=“0”;}
的事情怎么样?如果您不在乎礼貌,您可以随意说。但是为每个元素调用
matchMask
听起来有点低效。根据,它只能精确到53位。@FakeRainBrigand:谢谢,我添加了一个到第8.5节的链接。(我已经提到了53位的东西,但我记不起它的来源;我在规范以外的地方读过它,谢谢。)