Javascript号码获得另一个价值

我最近发现了一个奇怪的JS片段,但是我不确定这是一个错误还是有一些逻辑。

试试这个号码:9000000022903136 * 8 *警告它,console.log它,把它分配给一个variables。 您将获得值9000000022903136 * 0 *。 问题是为什么? 这是一个错误?

我也注意到,你从90000000229031352 90000000229031352到90000000229031368,90000000229031351你90000000229031340,90000000229031369你90000000229031369。

这发生在:Chrome,FF,Node.js

那么,计算机中的数字是有限的(大部分)。 你在这里看到的是floaty / double存储的数字的经典溢出,例如(实际的实现方式当然不同),它可以包含多个数字和它的指数。

123被存储为[1 2 3],指数2. 1.23被存储为[1 2 3],指数0。

所以,90000000229031368被存储为:

[9 0 0 0 0 0 0 0 2 2 9 0 3 1 3 6],指数16.正如你所看到的,最后8位数字没有空间了,所以当你阅读它的时候它就会被设置。

其他例子可能看起来矛盾,但请记住,计算机不会将这些数字存储在10位数字中,而是2位数字中。

阅读关于这个主题的更多信息,使用关键字:浮点浮点(例如维基百科)。

这是因为JavaScript数字是64位浮点数。

浮点数有两部分 – 小数部分定义数字的“值”,指数部分定义数字应该移位的小数点左边或右边多less。

为了说明这个工作,我将使用一个假想的浮点数字格式,它是基于十进制而不是二进制的:

我们将我们的虚构格式定义为8个字符的浮点数 – 也就是说这个数字必须存储在8个字符之内。 让我们的格式分区有6个字符作为小数部分和2个字符作为指数:

_ _ _ _ _ _ _ _ |_ _|_ _ _ _ _ _| <--- 8 char float exponent fractional 

为便于讨论,我们来创build一个语法来描述格式:

 exponent,fractional 

因此,例如,数字128可以存储为0,128 ,PI可以存储为-5,314159 (小数点左移5位)。

上面的PI案例是程序员第一次遇到浮点数 – 他们需要使用分数而不是简单的整数。 但是浮点格式还有另外一个特点 – 它可以存储大于分配空间的数字!

例如,如果我们想要以我们想象的8char浮点格式存储数字987654321呢? 这是超过6个字符! 那么,我们会这样做: 2,9876543 。 也就是说,我们存储最重要的数字,并将小数点右移2个空格。

如果我们尝试阅读这个数字,那么得到的是987654300。我们失去了最低有效位数! 嗯..听起来很熟悉。

在JavaScript的情况下,格式是IEEE 754 64位二进制浮点。 它为小数部分分配了52位(如果包含符号位则为53位)。 这意味着对于高达52位的数字,其行为就像一个整数。 任何更大的,它将开始牺牲最不重要的位(不是数字,位,所以舍入可能看起来奇怪的人类)。

查看这个维基百科的文章,了解更多关于64位浮点运算的细节: http : //en.wikipedia.org/wiki/Double_precision_floating-point_format