2017-07-28 69 views
0

在以下代碼中,i將始終爲偶數,因此商i/2應始終爲整數。我是否還應該使用Math.floor(i/2)來保證安全?我在問,因爲JavaScript不會將所有數字視爲浮點數,所以我擔心舍入誤差。通過商標對數組索引

for (var i = 0; i < data.length; i = i + 2) { 
    var name = names[i/2]; 
    ... 
} 

回答

0

按照JavaScript(ECMAScript®) Language Specification如果

i <= Number.MAX_SAFE_INTEGER + 1 

然後i可以確切地表示,分工應該很好。

Number.MAX_SAFE_INTEGER的值是最大的整數n,使得n和n + 1都可以精確地表示爲數值。

Number.MAX_SAFE_INTEGER的值是9007199254740991(2 -1)。

Section 12.7.3.2 Applying the/Operator

在其餘的情況下,如果既沒有無窮大,也不是零,也不NaN被涉及,則商被計算並舍入到使用IEEE 754-2008最接近的可表示值圓到最近,與均勻模式相關。如果幅度太大而無法表示,則操作溢出;那麼結果就是無限的適當符號。如果幅度太小而無法表示,則操作下溢,結果爲適當符號的零。ECMAScript語言要求支持IEEE 754-2008定義的逐漸下溢。

3

不,您不必在這種情況下使用Math.floor()

因爲i總是偶數,names[1.00]也等於names[1]

要檢查,請嘗試下面的JavaScript控制檯。

數組的長度將是20和第一10數組項將被打印

var names = ["nums1", "nums2", "nums3","nums4", "nums5", "nums6","nums7", 
 
    "nums8", "nums9","nums10", "nums11","nums12", "nums13","nums14", "nums15", 
 
    "nums16","nums17", "nums18", "nums19","nums20"]; 
 

 
for (var i = 0; i < names.length; i = i + 2) { 
 
    console.log(names[i/2]); 
 
}

+0

據我所知,它工作在這個特殊的例子,但你怎麼知道有沒有一些平臺,讓'我/ 2'將返回'1.00000002'並給出一個錯誤,如果我試圖通過索引呢? – Roland

+0

如果我從零開始,每次迭代增加2,我不明白爲什麼i/2會返回除了整數之外的任何值。你能說出任何你知道的平臺的例子嗎? –

2

除以甚至由2的整數,只要它不會溢出

總是返回一個整數
Number.MAX_SAFE_INTEGER 

之後,整數存儲爲2的冪,所以它們失去精度。
然而,大於這個大小的數組在訪問它們的元素時會遇到問題(因爲索引得到不精確),所以可以插入數組的元素的最大數目僅限於這個最大安全整數。所以基本上你的代碼總是能工作,如果不行的話,那是因爲數組溢出而不是因爲索引錯誤。不過,我比較推薦你做:

var array = ["one", "two", "three","four", "five", "six","seven", 
 
    "eight", "nine","ten", "eleven","twelve", "thirteen","fourteen", "fifteen", 
 
    "sixteen","seventeen", "eighteen", "nineteen","twenty"]; 
 
    
 
    for(var i=0,l=array.length/2;i<l;i++){ 
 
     console.log(array[i]); 
 
    }

因爲它節省了這些不必要的數學運算......

+0

@anvita感謝您添加一個片段;) –

+0

您能否提供一個鏈接到證明您的聲明的文檔?謝謝 – Roland

+1

@roland *在餘下的情況下,無論是無窮大,也不是零,也不涉及NaN,使用IEEE 754-2008圓到最近模式計算商並四捨五入到最接近的可表示值。如果幅度太大而無法表示,則操作溢出;那麼結果就是無限的適當符號。如果幅度太小而無法表示,則操作下溢,結果爲適當符號的零。 ECMAScript語言要求支持IEEE 754-2008定義的逐漸下溢* –