Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的JavaScript数字行为_Javascript_Numbers - Fatal编程技术网

奇怪的JavaScript数字行为

奇怪的JavaScript数字行为,javascript,numbers,Javascript,Numbers,在处理JavaScript数字时,我发现了以下奇怪的行为 var baseNum = Math.pow(2, 53); console.log(baseNum); //prints 9007199254740992 console.log(baseNum + 1); //prints 9007199254740992 again! console.log(baseNum + 2); //prints 9007199254740994, 2 more than +1 console.log(

在处理JavaScript数字时,我发现了以下奇怪的行为

var baseNum = Math.pow(2, 53);
console.log(baseNum); //prints 9007199254740992

console.log(baseNum + 1); //prints 9007199254740992 again!

console.log(baseNum + 2); //prints 9007199254740994, 2 more than +1

console.log(baseNum + 3) // prints 9007199254740996, 2 more than +2
console.log(baseNum + 4) // prints 9007199254740996, same as +3
这里发生了什么?我知道JavaScript只能表示高达
2^53
(它们在内部是“double”?)的数字,但为什么会出现这种行为


如果
2^53
是实际的最大值,那么为什么我们有
Number.max_值
1.7976931348623157e+308

这个数字实际上是双倍的。尾数有52位()。因此,存储2^53会切掉一位

使用3个符号位(相当直接)和另外两个尾数M和指数E存储数字。数字计算如下:

(1+M/2^53)*2^(E-1023)


我可能有一些细节,但基本的想法在那里。因此,当数字为2^53,2^(E-1023)=2^53时,由于M中只有52位,因此不能再表示最低位。

长存储中可存储的最大值远远大于长存储中可存储的最大值,具有精确的精度。浮点数有固定的最大有效位数,但数字的大小可能会大得多

为一个指数分配了一定数量的位(二的幂),它隐式地乘以存储在其余位中的尾数。超过某一点时,将失去精度,但可以不断增加指数以表示越来越大的震级。

给出的答案是好的

唯一需要补充的是你的第二个问题:

如果
2^53
是实际的最大值,那么为什么我们有
Number.max_值
1.7976931348623157e+308

正如您所演示的,它可以存储大于
2^53
的数字,但精度比
2^0
差。随着数字越来越大,它们的精确度也越来越低

因此,
数字中的最大值。max_值
表示它所能代表的“最大”值;但这并不意味着精度与
2^1
2^53
附近的值相同


由此推论,
Number.MIN\u值
是数字可以包含的最小值;不是最消极的。也就是说,它是离零最近的非零数字:
5.00E-324
(注意这是一个正数!)。

var base
,然后
baseNum
其他地方?@MarcB Copy-paste demon再次攻击!更正了在中详细介绍的错误文章。@Bill谢谢,这就解释了它!谢谢,我理解。但我的抱怨是在加1/2/3。。。你能解释一下吗?@AshwinPrabhu确实解释了,不是吗?因为在2^53以上,它不能再以1增加-它以2计。。。直到它变得越来越大,越来越不准确,以4s计,以此类推:你在纽约市中心,你被告知到伦敦市中心的距离是3465英里。现在你向西走一步。离伦敦还有3465英里。测量的精度是以英里为单位的,因此增加几英寸或几英尺并不会改变它。