我正在MDN上查看Number.isInteger()。我遇到了这个例子-
Number.isInteger(5.000000000000001); // false
我将值更改为5.0000000000000001,如果我在控制台上执行相同的方法,则结果为:
Number.isInteger(5.0000000000000001); // true
而且5.0000000000000001 === 5出来就是true

有人可以解释一下这里发生了什么吗?

最佳答案

JavaScript使用IEEE-754基本的64位二进制浮点格式。在这种格式中,每个有限数都表示为整数M乘以2、2E的幂。 M的大小必须小于253,E的范围可能是−1074至971。(更常见的描述对M和E的缩放比例不同,因此M具有小数位而不是整数,但这在数学上等效。)

对于数字5.000000000000001,可以最精确地表示为E = −50,因为这使M尽可能大,大约5•250 = 1.25•252。如果我们将E减小1,则M必须约为1.25•253,超过253的限制。

因此,给定E = −50,我们希望5.000000000000001 = M•2−50,这意味着M = 5.000000000000001•250 = 5•250 + .000000000000001•250。显然,第一项5•250是整数。第二项.000000000000001•250约为1.1259。因此,将5.000000000000001转换为JavaScript的Number格式时,我们需要使M为整数,因此必须将1.1259舍入为1。结果是M = 5•250 + 1,所以数字是(5•250 + 1)• 2-50 = 5.00000000000000088817841970012523233890533447265625。

另一方面,当我们有5.0000000000000001,又有一个零时,我们有5.0000000000000001•250 = 5•250 + .0000000000000001•250。在这种情况下,第二项.0000000000000001•250约为.11259。因此,当将5.0000000000000001转换为JavaScript的数字格式时,我们必须将.11259舍入为0,因此数字为((5•250)•2−50 = 5。

09-18 04:48