Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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_Arrays_Floating Point - Fatal编程技术网

JavaScript数组变得非常大时会丢失浮点精度吗?

JavaScript数组变得非常大时会丢失浮点精度吗?,javascript,arrays,floating-point,Javascript,Arrays,Floating Point,我对JavaScript相对不熟悉,最近有人告诉我,JavaScript数组包含一个length类型为Number的变量。当数组更新为数组中的元素数时,此长度将自动更新 然而,我也被告知JavaScript在内部使用64位浮点表示法来表示它的Number类。我们知道浮点运算不能精确地表示其范围内的所有整数 所以我的问题是,大型数组会发生什么情况,其中length+1不能精确表示序列中的下一个最大整数?根据数组的最大长度是4294967295数字。最大安全整数为9007199254740991,因

我对JavaScript相对不熟悉,最近有人告诉我,JavaScript数组包含一个
length
类型为
Number
的变量。当数组更新为数组中的元素数时,此长度将自动更新

然而,我也被告知JavaScript在内部使用64位浮点表示法来表示它的
Number
类。我们知道浮点运算不能精确地表示其范围内的所有整数

所以我的问题是,大型数组会发生什么情况,其中
length+1
不能精确表示序列中的下一个最大整数?

根据数组的最大长度是
4294967295
<代码>数字。最大安全整数为
9007199254740991
,因此您不必担心,因为发动机不会让您走那么远,例如:

new Array(4294967296); // RangeError: Invalid array length
报告的相关部分:

  • c。将newLen设置为32(Desc.[Value]])。
    B如果newLen不等于ToNumber(Desc.[Value]]),则引发RangeError异常
  • 因此,给出我们的示例长度
    4294967296

    var length = 4294967296;
    var int32length = length >>> 0; // Convert to int32
    int32length === 0; // Can't represent this as int32
    length !== int32length; // Therefore RangeException
    

    根据ECMA-262第5版规范,由于ToUint32抽象运算,数组的最大长度由无符号32位整数限制,因此最长的数组可能包含232-1=4294967295=42.9亿个元素。这是根据


    所以我猜@RGraham是对的,因为数组的最大长度是
    4294967295
    Number.MAX_SAFE_INTEGER
    9007199254740991
    所以您不必担心,因为引擎不会让您得到它far@RGraham谢谢你,如果你写下来作为回答,我会接受的。当你到达那个长度时会发生什么?解释器只是抱怨你,不让你更新数组吗?@Shaktal不客气。这似乎是对的,但有人对JS内部结构有更多的了解,可能会证明我错了!这似乎是合乎逻辑的,我会等待一段时间,然后接受,以确保虽然!值得记住的是,引擎盖下的数组与任何其他JavaScript对象一样,您可以像这样欺骗它。var tmp=[];tmp[0]=“0”;tmp[4294967294]=“4294967294”;控制台日志(tmp);数组[“0”,4294967285更多…],这意味着您可以通过只填充数组的两个元素来“伪造”大小,第一个和最后一个。@NeilMunro但是
    var temp=[0];温度[4294967296];温度长度==1,因此无法获得这样的真实长度。你要做的就是把一个字符串键放在一个冒充数组的对象上。这不是一个冒充数组的对象,数组只是一个普通对象的语法糖:第95页。“数组是一种特殊对象,它对数组索引属性键进行特殊处理”。这只是一个小小的警告。。。JavaScript处理在某些情况下可能有用的数组的特殊方式。