Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这些二进制表示会产生相同的数字?_Javascript_Binary_Ieee 754 - Fatal编程技术网

Javascript 为什么这些二进制表示会产生相同的数字?

Javascript 为什么这些二进制表示会产生相同的数字?,javascript,binary,ieee-754,Javascript,Binary,Ieee 754,根据文献记载,人们可以使用计算机将数字的二进制表示形式转换为数字本身 比如说, var number = parseInt("10100", 2); // number is 20 但是,请看下一个示例: var number = parseInt("1000110011000011101000010100000110011110010111111100011010000", 2); // number is 1267891011121314000 var number = parseInt

根据文献记载,人们可以使用计算机将数字的二进制表示形式转换为数字本身

比如说,

var number = parseInt("10100", 2);
// number is 20
但是,请看下一个示例:

var number = parseInt("1000110011000011101000010100000110011110010111111100011010000", 2);
// number is 1267891011121314000

var number = parseInt("1000110011000011101000010100000110011110010111111100100000000", 2);
// number is 1267891011121314000
这怎么可能


请注意,除了最后9位之外,二进制数几乎相同。

1267891011121314000远远超过了
Number.MAX_SAFE_INTEGER
(9007199254740991)。它不能在内存中安全地表示它

看看这个经典的例子:

1267891011121314000 == 1267891011121314001  // true

因为这是一个61位的数字,Javascript将存储的最高精度类型是64位浮点值(使用)

64位浮点没有61位的整数精度,因为从位布局图中可以看到使用的64位,尾数(或分数)只有52位可用,用于存储整数


许多bignum库的存在都是为了解决这类问题,因为这是科学应用中非常常见的问题。在硬件支持下,它们的速度往往不如数学快,但精度更高。从Github结果中提取可能是支持这些值所需要的。

JavaScript中的数字有上限和下限。JavaScript将数字表示为64位浮点。IEEE754


如果需要更大的支持,请查看JavaScript中的BigDecimal实现。

谷歌关键词:ieee754,浮点精度。我从另一个角度来看:
100011000011101000010000110011001111111111111111110001010000
大于52位。@zerkms有关详细信息,我们必须进入
parseInt
的规范。这与
parseInt
的详细信息无关,但是IEEE754。标准声明ES数字是IEEE754双精度数字(我们不应该关心它在内部是如何实现的,在外部它必须遵循所提到的标准语义)。“事实上,parseInt专门将值映射到[-2^31,2^31-1]”---这肯定不是真的。好吧,第一个短语必须重新措辞。我错误地认为它是“不正确的”,但它是极其误导的
parseInt
生成整数,它是一个分数的52位,而不是64位。@zerkms这就是我得到的。换句话讲得更清楚些。如果你在某处提到神奇的“52比特”,它会让我成为一天中最快乐的猫:-)(无论如何,投票结果都是向上的)