根据文档,可以使用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位外,二进制数几乎相同。
答案 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实现。