Javascript 用商索引数组

Javascript 用商索引数组,javascript,rounding-error,rounding,Javascript,Rounding Error,Rounding,在下面的代码中,i将始终是一个偶数,因此商i/2应始终是一个整数。为了安全起见,我是否仍应使用Math.floor(I/2)?我这样问是因为JavaScript确实将所有数字都视为浮点,所以我担心舍入错误 for (var i = 0; i < data.length; i = i + 2) { var name = names[i / 2]; ... } for(变量i=0;i

在下面的代码中,
i
将始终是一个偶数,因此商
i/2
应始终是一个整数。为了安全起见,我是否仍应使用
Math.floor(I/2)
?我这样问是因为JavaScript确实将所有数字都视为浮点,所以我担心舍入错误

for (var i = 0; i < data.length; i = i + 2) {
    var name = names[i / 2];
    ...
}
for(变量i=0;i
否。在这种情况下,您不必使用
Math.floor()

因为
i
总是偶数,而且
names[1.00]
names[1]
等价

要进行检查,请在javascript控制台中尝试以下命令

数组长度为20,将打印前10个数组项

var name=[“nums1”、“nums2”、“nums3”、“nums4”、“nums5”、“nums6”、“nums7”,
“nums8”、“nums9”、“nums10”、“nums11”、“nums12”、“nums13”、“nums14”、“nums15”,
“nums16”、“nums17”、“nums18”、“nums19”、“nums20”];
对于(变量i=0;i}
否。在这种情况下,您不必使用
Math.floor()

因为
i
总是偶数,而且
names[1.00]
names[1]
等价

要进行检查,请在javascript控制台中尝试以下命令

数组长度为20,将打印前10个数组项

var name=[“nums1”、“nums2”、“nums3”、“nums4”、“nums5”、“nums6”、“nums7”,
“nums8”、“nums9”、“nums10”、“nums11”、“nums12”、“nums13”、“nums14”、“nums15”,
“nums16”、“nums17”、“nums18”、“nums19”、“nums20”];
对于(变量i=0;i}
只要不溢出,偶数整数除以2总是返回整数

Number.MAX_SAFE_INTEGER
之后,整数以二的幂存储,因此它们将失去精度。
但是,大于此大小的数组在访问其元素时会遇到问题(因为索引变得不精确),可以放入数组的元素的最大数量仅限于此最大安全整数。因此,基本上你的代码总是可以工作的,如果不能,那是因为数组溢出,而不是因为索引错误。但是,我建议您:

var数组=[“一”、“二”、“三”、“四”、“五”、“六”、“七”,
“八”、“九”、“十”、“十一”、“十二”、“十三”、“十四”、“十五”,
“十六”、“十七”、“十八”、“十九”、“二十”];

对于(var i=0,l=array.length/2;i偶数整数除以2总是返回一个整数,只要它不溢出

Number.MAX_SAFE_INTEGER
之后,整数以二的幂存储,因此它们将失去精度。
但是,大于此大小的数组在访问其元素时会遇到问题(因为索引变得不精确),可以推入数组的最大元素数限制为正好此最大安全整数。因此,基本上,您的代码将始终工作,如果不工作,那是因为数组溢出,而不是因为索引错误。但是,我建议您执行以下操作:

var数组=[“一”、“二”、“三”、“四”、“五”、“六”、“七”,
“八”、“九”、“十”、“十一”、“十二”、“十三”、“十四”、“十五”,
“十六”、“十七”、“十八”、“十九”、“二十”];
对于(var i=0,l=array.length/2;i根据if

i根据if


我知道它在这个特定的例子中是有效的,但是你怎么知道没有一个平台,
i/2
会返回
1.00000002
,如果我尝试用它来索引,就会给出一个错误?如果我从零开始,每次迭代增加2,我不明白为什么i/2只返回一个整数。你能说出你所知道的任何平台的任何例子吗?我知道它在这个特定的例子中是有效的,但是你怎么知道没有一个平台,
I/2
会返回
1.00000002
,如果我试着用它来索引,会给出一个错误?如果我从zer开始o并且每次迭代增加2,我不明白为什么I/2只返回一个整数,而返回任何值。你能说明你知道的任何平台的任何例子吗?你能提供一个链接到证明你的声明的文档吗?Thanks@roland在其余情况下,如果如果不包含0或NaN,则使用IEEE 754-2008“四舍五入到最近的模式”计算商并四舍五入到最近的可表示值。如果幅值太大而无法表示,则运算溢出;结果是适当符号的无穷大。如果幅值太小而无法表示,则运算下溢,并且结果是相应符号的零。ECMAScript语言要求支持IEEE 754-2008定义的逐渐下溢。链接到中的相关部分您可以提供证明您的声明的文档链接吗?Thanks@roland在剩下的情况下,既不涉及无穷大,也不涉及零,也不涉及NaN,商是使用IEEE 754-2008四舍五入至最近模式计算并四舍五入至最接近的可表示值。如果幅值太大而无法表示,则运算溢出;结果为适当符号的无穷大。如果幅值太小而无法表示,则运算下溢,且结果为适当符号的零。ECMAScIPT语言要求支持IEEE 754-2008定义的逐渐下溢。链接至