为什么JavaScript中的数字会出现这种情况

为什么JavaScript中的数字会出现这种情况,javascript,Javascript,我们发现: 这到底是怎么回事?这里发生了什么?为什么第一行的数字会改变 JavaScript使用IEEE 754中指定的双精度浮点格式数字,并且只能安全地表示介于-(253-1)和253-1之间的数字 数字111111111(18位)高于该范围 参考资料:如上所述,JavaScript使用。52位用于值,11位用于指数,1位用于加号/减号 这篇文章完美地解释了数字的整个过程。本质上,JavaScript使用一个沿52位移动的指针来标记浮点。当然,您需要更多的位来表示更大的数字,例如111111

我们发现:

这到底是怎么回事?这里发生了什么?为什么第一行的数字会改变

JavaScript使用IEEE 754中指定的双精度浮点格式数字,并且只能安全地表示介于-(253-1)和253-1之间的数字

数字111111111(18位)高于该范围


参考资料:

如上所述,JavaScript使用。52位用于值,11位用于指数,1位用于加号/减号

这篇文章完美地解释了数字的整个过程。本质上,JavaScript使用一个沿52位移动的指针来标记浮点。当然,您需要更多的位来表示更大的数字,例如111111111111

要将您的数字转换为二进制,它将是

sign - 0
exponent - 10000110111
mantissa - 1000101010111110111101111000010001100000011100011100
值占用的空间越大,小数位数的可用空间就越小


最终,由于最右边缺少位,简单的计算(如增量为1)将变得不准确,而可能的最小增量将取决于指针的位置。

向下投票者应该注释。JavaScript数字是精度有限的二进制浮点值。第一个数字大于可精确表示的最大整数的值。数字大于数字。MAX_SAFE_integer,related:请注意,会发生完全相同的事情(或者至少会发生奇怪的事情)如果您试图在任何语言中使用该数字作为使用64位IEEE浮点的值。@Hacketo,这只回答了我问题的最后一部分。我想您在这里有些问题,但我对范围有异议:)@Pointy哇-(253-1)到253-1根本没有什么用处。谢谢。:)