我有一个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
相同,但事实并非如此。
答案 0 :(得分:6)
在JavaScript中,Number
类型为64-bit double-precision value(more和more)。你已经在那里指定了64位,这超出了64位双精度值可以准确指定的范围(因为它是浮点类型,因此必须将一些位用于精度)。 JavaScript没有整数类型(更不用说64位版本),这就是完美保真度转换所需要的。
我不是所有关于浮点位表示的,但IIRC是64位双精度数,准确表示大约53位有效位的整数值,请参阅链接的信息。