我最近发现了一个奇怪的 JS 代码片段,但是我不确定它是否是一个错误或者它是否有一些逻辑。
试试这个号码:9000000022903136*8* 警告它,控制台记录它,将它分配给一个变量。您将获得值 9000000022903136*0*。问题是为什么?这是一个错误吗?
我还注意到你从 90000000229031352 得到 90000000229031360 到 90000000229031368,对于 90000000229031351 你得到 90000000229031340,对于 9000000022903 1369 你得到 90000000229031369。
这发生在:Chrome、FF、Node.js
最佳答案
嗯,计算机中的数字是有限的(大部分)。你在这里看到的是一个 float /双重存储数的经典溢出,它可以包含一些数字,以及它的指数,例如(实际实现不同,当然):
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 为基数。
使用关键字阅读有关此主题的更多信息:Float float (例如在维基百科上)。
关于Javascript 数字获取另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19533604/