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

时间:2016-10-31 20:56:04

标签: javascript binary ieee-754

根据文档,可以使用parseInt(string, base)将数字的二进制表示转换为数字本身。

例如,

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位外,二进制数几乎相同。

3 个答案:

答案 0 :(得分:2)

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

看看这个经典的例子:

1267891011121314000 == 1267891011121314001  // true

答案 1 :(得分:1)

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

64位浮点数没有61位的积分精度,因为使用的是64位are split into the fraction and exponent.从位布局的图形中可以看出,只有52位可用于尾数(或分数) ),用于存储整数。

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

答案 2 :(得分:0)

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

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