2016-10-31 26 views
3

根据文档,可以使用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位。

+1

关键字google:ieee754,浮点精度。 – zerkms

回答

2

1267891011121314000是通过Number.MAX_SAFE_INTEGER(9007199254740991)的方式。它不能安全地在内存中表示它。

在这个典型的例子请看:

1267891011121314000 == 1267891011121314001 // true 
+0

我会从另一边走:'1000110011000011101000010100000110011110010111111100011010000'长于52位。 – zerkms

+0

@zerkms有关详细信息,我们将不得不进入'parseInt'的规范。 –

+1

这不是关于'parseInt'的细节,而是IEEE754。 – zerkms

1

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

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

许多bignum库存在解决这种事情,因为它是科学应用中的一个非常普遍的问题。他们倾向于不像硬件支持那样快速,但可以提供更高的精度。从Github的结果来看,bignumber.js可能是你需要支持这些值的。

+0

好吧,第一句话必须改写。我错了,它是“不正确”,但它是非常误导。 'parseInt'产生整数,它大约是52比特的一小部分,而不是整个64比特。 – zerkms

+0

@zerkms这就是我正在得到的。换句话说要更清楚。 – ssube

+0

如果你在某处提到神奇的“52位”,它会让我成为当天最幸福的猫:-)(无论如何都是upvoted) – zerkms

0

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

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

相关问题